sp_executesql 使用復(fù)雜的Unicode 表達(dá)式錯(cuò)誤的解決方法,需要的朋友可以參考下
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ‘+’.
當(dāng)你嘗試執(zhí)行下面這段代碼時(shí),會(huì)得到如上這個(gè)錯(cuò)誤提示。
代碼如下:
DECLARE @MyName NVARCHAR(100)
DECLARE @FieldName SYSNAME = N’Name’
EXECUTE sp_executesql N’SELECT TOP 1 @OutputName = [‘+ @FieldName +’] FROM [dbo].[Member]’,
N’@OutputName NVARCHAR(100) OUTPUT’,
@MyName OUTPUT;
SELECT @MyName
問(wèn)題出于不允許使用更復(fù)雜的 Unicode 表達(dá)式(例如使用 + 運(yùn)算符連接兩個(gè)字符串)。可以參考:
[ @statement = ] statement
包含 Transact-SQL 語(yǔ)句或的 Unicode 字符串。statement 必須是 Unicode 常量或 Unicode 變量。不允許使用更復(fù)雜的 Unicode 表達(dá)式(例如使用 + 運(yùn)算符連接兩個(gè)字符串)。不允許使用字符常量。如果指定了 Unicode 常量,則必須使用 N 作為前綴。例如,Unicode 常量 N’sp_who’ 是有效的,但是字符常量 ‘sp_who’ 則無(wú)效。字符串的大小僅受可用數(shù)據(jù)庫(kù)服務(wù)器內(nèi)存限制。在 64 位服務(wù)器中,字符串大小限制為 2 GB,即 nvarchar(max) 的最大大小。
解決問(wèn)題,可以宣告一個(gè)變量如下代碼DECLARE @sql NVARCHAR(MAX),把帶動(dòng)態(tài)的數(shù)據(jù)名,表名或是字段的SQL語(yǔ)句賦值于這個(gè)變量, 然后用這個(gè)變量傳入sp_executesql中。
代碼如下:
DECLARE @MyName NVARCHAR(100)
DECLARE @FieldName SYSNAME = N’Name’
DECLARE @sql NVARCHAR(MAX) = N’SELECT TOP 1 @OutputName = [‘+ @FieldName +’] FROM [dbo].[Member]’
EXECUTE sp_executesql @sql,
N’@OutputName NVARCHAR(100) OUTPUT’,
@MyName OUTPUT;
SELECT @MyName
變通一下,問(wèn)題輕而易舉解決。