有人可以解释为什么我必须在这里输入10个单引号才能将它存储在列中吗?我试图理解这个逻辑......
exec('UPDATE [SomeTable] SET [SomeColumn] = '''''''''''', [AnotherColumn] = Null ')
我一直在添加引号,直到我得到我想要的输出,但现在我想知道为什么我必须输入这么多引号。
答案 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 = ''''''
,但由于这本身就在一个字符串中,每个转义的报价应该加倍,导致你有十二个引号。