【问题标题】:Adding an apostrophe into a dynamic SQL在动态 SQL 中添加撇号
【发布时间】:2018-08-17 13:54:35
【问题描述】:

我想问一下如何在动态 SQL 中添加撇号。我需要在其中一个必须有撇号的列中返回一条 SQL 语句。

我有如下声明:

SET @SQL_String = N'INSERT INTO #ReturnTable
    (
    TableName,
    ColName,
    SQL_Statement,
    Value
     )
VALUES
    (
    ''' + @TableName + ''',
    ''' + @ColName + ''',
    ''' +
         'SELECT ' + 
             @ColName +
         ' FROM ' +
             @TableSchema + '.' + @TableName +
         ' WHERE ' + 
             @ColName + ' = ' + CAST(@GuidArgument AS NVARCHAR(50)) + ';' +''',
        (
        SELECT
            ' + @ColName + '
        FROM
            ' + @TableSchema + '.' + @TableName +
       ' WHERE '
            + @ColName + ' = ''' + CAST(@GuidArgument AS NVARCHAR(50)) + 
       '''))';

执行:

EXECUTE @RC = [dbo].[GetLocationOfGuidPre] 'F2CAB996-F00F-43B8-A67A-0000721A829D'

我需要将整个第一个 CAST 放入一对 '。

我试过了:

  • 将整个CAST 语句放入一个单独的变量中,例如:DECLARE @Test NVARCHAR(50);
    • SET @Test = CAST(@GuidArgument AS NVARCHAR(50));
    • SET @Test = 'CAST(@GuidArgument AS NVARCHAR(50))';
    • SET @Test = '''CAST(@GuidArgument AS NVARCHAR(50))''';
  • 再添加两个撇号:
    • ' WHERE ' + @ColName + ' = ''' + CAST(@GuidArgument AS NVARCHAR(50)) + ''';'

【问题讨论】:

  • 您能strip your example down 减少字段以更好地说明问题的核心吗?
  • 嗯,我希望现在更好。
  • 您是说@GuidArgument 参数包含撇号吗?如果是这样,我认为您需要使用REPLACE 执行类似' WHERE ' + @ColName + ' = ''' + REPLACE(CAST(@GuidArgument AS NVARCHAR(50)), '''', '''''') + ''';' 的操作,将每个撇号替换为两个。
  • sp_executesql中使用参数传递常量值,再也不用担心单引号了。

标签: sql sql-server sql-server-2012 dynamic-sql


【解决方案1】:

请使用 CHAR(39) 而不是直接在动态代码中输入 '。 示例:

declare @my_dynamic_sql nvarchar(max) = 'print char(39);';
exec(@my_dynamic_sql);

【讨论】:

  • 有效!非常感谢!
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多