我正在尝试将insert
一些文本数据放入SQL Server
9中的表中。
文本包含一个单引号(')。
我该如何逃避呢?
我尝试使用两个单引号,但是这给我带来了一些错误。
例如。 insert into my_table values('hi, my name''s tim.');
我正在尝试将insert
一些文本数据放入SQL Server
9中的表中。
文本包含一个单引号(')。
我该如何逃避呢?
我尝试使用两个单引号,但是这给我带来了一些错误。
例如。 insert into my_table values('hi, my name''s tim.');
Answers:
单引号可以通过加倍来转义,就像您在示例中向我们展示的一样。以下SQL说明了此功能。我在SQL Server 2008上对其进行了测试:
DECLARE @my_table TABLE (
[value] VARCHAR(200)
)
INSERT INTO @my_table VALUES ('hi, my name''s tim.')
SELECT * FROM @my_table
value
==================
hi, my name's tim.
如果用另一个单引号将单引号转义对您不起作用(例如,对于我最近的REPLACE()
查询中的一种无效),则可以SET QUOTED_IDENTIFIER OFF
在查询之前使用,然后SET QUOTED_IDENTIFIER ON
在查询之后使用。
例如
SET QUOTED_IDENTIFIER OFF;
UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");
SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again
报价加倍本来可以奏效,所以它对您不起作用很奇怪。但是,另一种方法是在字符串周围使用双引号而不是单引号。即
insert into my_table values("hi, my name's tim."
);
另外要注意的另一件事是,它是否确实存储为经典的ASCII'(ASCII 27)或Unicode 2019(看起来相似,但不相同)。
这在插入内容上没什么大不了的,但这可能意味着选择和更新的世界。
如果它是unicode值,则在WHERE子句中转义'(例如,blah ='Workers's Comp')将返回,就像如果“ Worker's Comp”中的“ unicode值。
如果您的客户端应用程序支持自由键以及基于复制和粘贴的输入,则某些行可能是Unicode,而其他行可能是ASCII!
一种简单的确认方法是执行某种开放式查询,该查询将带回您要搜索的值,然后将其复制并粘贴到notepad ++或其他支持unicode的编辑器中。
ASCII值和unicode值之间的不同外观应该对眼睛来说很明显,但是如果您偏向肛门,则在十六进制编辑器中它将显示为27(ascii)或92(unicode)。
我们中的许多人都知道,转义单引号的流行方法是将它们加倍,如下所示。
PRINT 'It''s me, Arul.';
我们将研究转义单引号的其他替代方法。
1.UNICODE字符
39是单引号的UNICODE字符。因此,我们可以像下面这样使用它。
PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';
2.QUOTED_IDENTIFIER
另一个简单且最佳的替代解决方案是使用QUOTED_IDENTIFIER。当QUOTED_IDENTIFIER设置为OFF时,字符串可以用双引号引起来。在这种情况下,我们不需要转义单引号。因此,这种方法在使用许多带单引号的字符串值时非常有用。当使用许多行的INSERT / UPDATE脚本(其中列值具有单引号)时,这将非常有帮助。
SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;
结论
上述方法适用于AZURE和本地。
只需在插入任何内容之前插入一个'。它将像sqlServer中的转义字符
示例:当您有一个字段as时,我很好。您可以这样做:UPDATE my_table SET row ='我很好。';
这应该起作用:使用反斜杠并加双引号
"UPDATE my_table SET row =\"hi, my name's tim.\";
PRINT \"hi, my name's tim.\";
将在SSMS中起作用?它根本不起作用,而且从未有人告诉过它起作用。