如何在SQL Server中转义单引号?

How do I escape a single quote in SQL Server?

我正在尝试将insert一些文本数据放入SQL Server 9中的表中。

该文本包括单引号(')。

我怎么逃避?

我尝试使用两个单引号,但它给我一些错误。

例如。insert into my_table values('hi, my name''s tim.');


单引号通过将它们加倍来进行转义,就像您在示例中向我们展示的那样。以下SQL说明了此功能。我在SQL Server 2008上测试过它:

1
2
3
4
5
6
7
DECLARE @my_table TABLE (
    [VALUE] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

结果

1
2
3
VALUE
==================
hi, my name's tim.


如果使用另一个单引号转义单引号不适合您(就像我最近的REPLACE()查询之一那样),您可以在查询之前使用SET QUOTED_IDENTIFIER OFF,然后在查询之后使用SET QUOTED_IDENTIFIER ON

例如

1
2
3
4
5
6
SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME,"'S","S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again


怎么样:

1
INSERT INTO my_table VALUES('hi, my name'+CHAR(39)+'s tim.')


引用的加倍应该是有效的,所以它对你不起作用是特殊的;但是,另一种方法是在字符串周围使用双引号字符而不是单引号字符。即,

insert into my_table values("hi, my name's tim.");


有两种方法可以解决这个问题:

对于',你可以简单地在字符串中加倍,例如
select 'I''m happpy' -- will get: I'm happy

对于你不确定的任何字符:在sql server中你可以通过select unicode(':')获取任何char的unicode

所以这种情况你也可以select 'I'+nchar(39)+'m happpy'


另外要注意的是它是否真的存储为经典的ASCII'(ASCII 27)或Unicode 2019(看起来相似但不相同)。这对于插入来说并不是什么大不了的事,但它可能意味着选择和更新世界。如果它是unicode值,那么在WHERE子句中转义'(例如,在blah ='Workers''sComp'中)将返回,就像你正在搜索的值一样,如果'in"Worker's Comp"实际上是unicode value。如果你的客户端应用程序支持自由键,以及基于复制和粘贴的输入,它可能在某些行中是Unicode,在其他行中可能是ASCII!
确认这一点的一种简单方法是通过某种开放式查询来恢复您要搜索的值,然后将其复制并粘贴到notepad ++或其他一些支持unicode的编辑器中。 ascii值和unicode之间的不同外观对于眼睛应该是显而易见的,但是如果你倾向于肛门,它将在十六进制编辑器中显示为27(ascii)或92(unicode)。


这应该工作:使用反斜杠并加上双引号

1
"UPDATE my_table SET row ="hi, my name's tim.";

只需在要插入的任何内容之前插入'。它将像sqlServer中的转义字符

例:
如果你有一个领域,我很好。
你可以做:
UPDATE my_table SET row ='我很好。';


这应该工作

1
2
3
4
DECLARE @singleQuote CHAR
SET @singleQuote =  CHAR(39)

INSERT INTO my_table VALUES('hi, my name'+ @singleQuote +'s tim.')

1
2
3
string VALUE ="Abhishek's";

VALUE = REPLACE(VALUE,"'","''");