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

Che*_*ise 1 sql t-sql sql-server sql-server-2005

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

exec('UPDATE [SomeTable] SET [SomeColumn] = '''''''''''', [AnotherColumn] = Null ')
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*and 8

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

EXEC('
  DECLARE @x TABLE(x VARCHAR(10));
  INSERT @x SELECT CHAR(39) + CHAR(39);
  SELECT x FROM @x;
');
Run Code Online (Sandbox Code Playgroud)

我通常会这样做,以避免在构造动态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;
Run Code Online (Sandbox Code Playgroud)

不,这不会使这个特定的情况下,任何可读性更强,当然,但是当你在一个大的字符串引用相同的数据库,表或列多次,它的效果要好得多更换令牌($db$,$table$,等)比处理所有其他连接混乱.恕我直言.