创建动态SQL查询

时间:2013-12-01 08:03:11

标签: sql-server tsql

请参阅此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',则查询会抛出错误:

  

字符串“”后面的未闭合引号。 “。”

附近的语法不正确

我该如何解决这个问题?

2 个答案:

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