请参阅此SQL代码:
DECLARE @MyQuery nvarchar(max)
set @MyQuery = 'SELECT TOP 1 @TranslatedMessageOutput =
' + @LanguageName + ' FROM local_translation WHERE English =
'+CHAR(39)+CHAR(39)+Convert(nvarchar(50),
(select English from inserted))
+CHAR(39)+CHAR(39)+CHAR(39)+
' AND [' + @LanguageDateName + '] NOT LIKE ''%1900%'''
如果我为英语键入abc
,则此查询可以正常运行。
但如果我为英语输入'abc'
,则查询会抛出错误:
字符串“”后面的未闭合引号。 “。”
附近的语法不正确
我该如何解决这个问题?
答案 0 :(得分:1)
我怀疑您需要转义此查询的输出:
(select English from inserted)
在
中(select replace(English, '''', '''''') from inserted)
在将结果连接到动态SQL语句之前,上面将'
替换为''
。但是对于任何动态SQL,我强烈建议您使用绑定值来防止此类SQL语法错误和SQL注入!即你应该能够写出这样的东西:
declare @English;
select @English = English from inserted;
set @MyQuery = 'SELECT TOP 1 @TranslatedMessageOutput =
' + @LanguageName +
' FROM local_translation WHERE English = @English'
' AND [' + @LanguageDateName + '] NOT LIKE ''%1900%''';
-- ...
答案 1 :(得分:0)
在动态SQL查询中,为避免混淆,请使用Char(39)
代替'
。
例如:
SET @T='SELECT '+CHAR(39)+'NAME'+CHAR(39)
返回
SELECT 'NAME'