Sql server 创建动态sql查询

Sql server 创建动态sql查询,sql-server,tsql,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), (s

请参阅以下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'
,查询将抛出一个错误:

字符串“”后的未闭合引号。“”附近的语法不正确


如何解决此问题?

我怀疑您需要转义此查询的输出:

(select 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%''';
-- ...

在动态sql查询中,为了避免混淆,请使用
Char(39)
而不是
。 例如:

返回

SELECT 'NAME'
SET @T='SELECT '+CHAR(39)+'NAME'+CHAR(39)
SELECT 'NAME'