我在存储过程中有以下内容:
DECLARE @new_column_name varchar(9)
DECLARE @table_name varchar(16)
DECLARE @SQLString nvarchar(2000)
SET @new_column_name = N'name'
SET @table_name = N'tbl_test_table'
SET @SQLString = N'SELECT @CountOUT = COUNT(*) FROM [' + @table_name + '] WHERE [' + @new_column_name + '] = ''' + @description + ''''``
在@description中只有一个引号之前,这个工作绝对正常。在我的C#中,我用两个单引号替换单引号,但在创建上述SQL字符串时仍然会出现问题。
任何想法如何解决这个问题:
SET @description = N'Adam''s Car'
我使用动态SQL的原因是因为'name'列是临时的,只存在于存储过程的生命周期中。
答案 0 :(得分:3)
注意:请参阅The Curse and Blessings of Dynamic SQL - Dealing with Dynamic Table and Column Names
你仍然应该使用参数化的sql并使用exec sp_executesql
(带参数)。也可以在对象名称周围使用QUOTENAME
,而不是自己连接括号。
SET @SQLString = N'SELECT @CountOUT = COUNT(*) FROM ' +
QUOTENAME(@table_name) + ' WHERE ' +
QUOTENAME(@new_column_name) + ' = @description'
EXECUTE sp_executesql @SQLString
,N'@description varchar(50), @CountOUT int OUTPUT'
,@description = @description
,@CountOUT = @CountOUT OUTPUT;