为什么我必须在动态sql中键入这么多单引号来转义引号?

时间:2012-02-14 14:55:47

标签: sql sql-server sql-server-2005 tsql

有人可以解释为什么我必须在这里输入10个单引号才能将它存储在列中吗?我试图理解这个逻辑......

exec('UPDATE [SomeTable] SET [SomeColumn] = '''''''''''', [AnotherColumn] = Null ')

我一直在添加引号,直到我得到我想要的输出,但现在我想知道为什么我必须输入这么多引号。

3 个答案:

答案 0 :(得分:8)

如果你真的想在数据库中存储CHAR(39)而不必逃避它,你总是可以使用等价物('')(虽然我不确定你的意图是否存储空字符串或实际存储两个单引号):

EXEC('
  DECLARE @x TABLE(x VARCHAR(10));
  INSERT @x SELECT CHAR(39) + CHAR(39);
  SELECT x FROM @x;
');

我通常会这样做,以避免在构造动态SQL时串联和丑陋的单引号嵌套:

DECLARE @sql NVARCHAR(MAX) = N'';

SET @sql = 'SELECT foo = $sq$bar$sq$;';

SET @sql = REPLACE(@sql, '$sq$', CHAR(39));

SELECT @sql;

EXEC sp_executesql @sql;

不,这并不会使这个特定情况更具可读性,但是当你在一个大字符串中多次引用相同的数据库,表或列时,它更适合替换标记({{1 }},$db$等)比处理所有其他连接混乱。 IMHO。

答案 1 :(得分:1)

要插入的代码''进入表格看起来像这样:

UPDATE [SomeTable] SET [SomeColumn] = '''''', [AnotherColumn] = Null

但是,因为您在另一个字符串中执行此操作,所以您需要转义转义的引号,从而生成您提供的代码。

答案 2 :(得分:1)

你需要/有十二个引号。字符串中的每个引号都会被第二个引号转义。你通常需要做set column = '''''',但由于这本身就在一个字符串中,每个转义的报价应该加倍,导致你有十二个引号。