2010-08-17 28 views
0

在存儲過程中我有以下幾點:動態T-SQL引號字符串

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的原因是因爲在「名稱」列是臨時的存儲過程的生命週期中只存在。

+0

在您的C#ADO.NET代碼中使用參數... – 2010-08-17 09:20:30

+0

我確實不幸無濟於事! – adamwtiko 2010-08-17 09:24:57

回答

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;