我有一个存储过程,我传递一个unicode参数,如下所示:
מוכר שמן קוקוס בכחל מיני ואריציות
现在的问题是,当我在表单中输入一些内容来搜索m表中的这个值时,就像fllowing一样:
IF LEN(@SearchValue) > 0
BEGIN
SET @WhereQuery = @WhereQuery +
'(Type=' + CAST(@type AS NVARCHAR(10)) + ' and UserId=' + CAST(@userid AS NVARCHAR(10)) + ') and'
+ '(convert(nvarchar(max),SentWord) like ''%' + @SearchValue + '%'' or '
+ 'convert(nvarchar(max),Comment) like ''%' + @SearchValue + '%'')'
END
其中@SearchValue在SQL Server中定义为nvarchar(200),并且包含特定值的表列为:
SentWord和Comment都是unicode,定义为nvarchar(600)。
我在这里做错了什么?为什么不能通过希伯来字符来搜索MSSQL?有人可以帮助我吗?
正如@Jeroen所说,可能的修复方法是在LIKE运算符之后添加N,如下所示:
IF LEN(@SearchValue) > 0
BEGIN
SET @WhereQuery = @WhereQuery +
'(Type=' + CAST(@type AS NVARCHAR(10)) + ' and UserId=' + CAST(@userid AS NVARCHAR(10)) + ') and'
+ '(convert(nvarchar(max),SentWord) like N''%' + @SearchValue + '%'' or '
+ 'convert(nvarchar(max),Comment) like N''%' + @SearchValue + '%'')'
END
但它仍然不起作用......
答案 0 :(得分:1)
不要那样连接你的字符串!这是一场注射噩梦!
接下来,您将文字unicode字符串声明为varchar
,而不是nvarchar
。如果您尝试SELECT 'מוכר שמן קוקוס בכחל מיני ואריציות';
,请注意返回值为'???? ??? ????? ???? ???? ????????'
。您需要在其前面添加N
,因此:SELECT N'מוכר שמן קוקוס בכחל מיני ואריציות';
。
现在,重要的是对SQL进行参数化...不幸的是,我没有足够的SQL来为你实际完成这项工作,所以这里有一个不同的例子:
DECLARE @SQL nvarchar(MAX);
DECLARE @string nvarchar(20) = N'Test';
SET @SQL = 'SELECT * FROM MyTable WHERE MyColumn = @dString;'; --Notice the variable in the dynamic SQL
PRINT @SQL;
EXEC sp_executesql @SQL, N'dString nvarchar(20)',@dString = @string; --Notice the variable declaration and assignment.