动态t-sql引用字符串

时间:2010-08-17 09:18:08

标签: c# sql sql-server-2005 tsql

我在存储过程中有以下内容:

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'列是临时的,只存在于存储过程的生命周期中。

1 个答案:

答案 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;