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

时间:2009-10-19 01:18:22

标签: sql sql-server tsql single-quotes

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

该文字包含单引号(')。

我该如何逃避?

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

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

15 个答案:

答案 0 :(得分:1176)

单引号通过将它们加倍来转义,就像您在示例中向我们展示的那样。以下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.

答案 1 :(得分:64)

如果使用其他单引号转出单引号并不适合您(就像我最近的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

答案 2 :(得分:37)

怎么样:

insert into my_table values('hi, my name'+char(39)+'s tim.')

答案 3 :(得分:16)

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

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

答案 4 :(得分:6)

Also another thing to be careful of is whether or not it is really stored as a classic ASCII ' (ASCII 27) or Unicode 2019 (which looks similar, but not the same).

This isn't a big deal on inserts, but it can mean the world on selects and updates.
If it's the unicode value then escaping the ' in a WHERE clause (e.g where blah = 'Workers''s Comp') will return like the value you are searching for isn't there if the ' in "Worker's Comp" is actually the unicode value.

If your client application supports free-key, as well as copy and paste based input, it could be Unicode in some rows, and ASCII in others!

A simple way to confirm this is by doing some kind of open ended query that will bring back the value you are searching for, and then copy and paste that into notepad++ or some other unicode supporting editor.

The differing appearance between the ascii value and the unicode one should be obvious to the eyes, but if you lean towards the anal, it will show up as 27 (ascii) or 92 (unicode) in a hex editor.

答案 5 :(得分:4)

解决此问题的两种方法:

对于',您只需在字符串中加倍,例如 select 'I''m happpy' -- will get: I'm happy

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

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

答案 6 :(得分:0)

这应该有效

some_variable:= to_char(to_number(some_variable)+1,'FM0000');

答案 7 :(得分:0)

这应该起作用:使用反斜杠并在双引号内

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

答案 8 :(得分:0)

只需在任何要插入的内容前插入一个'。就像sqlServer中的转义字符

示例: 如果您有一个字段,我很好。 你可以做: UPDATE my_table SET row ='我很好。';

答案 9 :(得分:0)

以下语法将使您只使用一个引号:

SELECT ''''

结果将是单引号。对于创建动态SQL可能会很有帮助:)。 enter image description here

答案 10 :(得分:0)

我们很多人都知道,转义单引号的流行方法是像下面那样将其加倍。

PRINT 'It''s me, Arul.';

Doubling the Single Quotes Method

我们将研究转义单引号的其他替代方法。

1.UNICODE字符

39是单引号的UNICODE字符。所以我们可以像下面这样使用它。

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

UNICODE Characters

2.QUOTED_IDENTIFIER

另一个简单,最佳的替代解决方案是使用QUOTED_IDENTIFIER。 当QUOTED_IDENTIFIER设置为OFF时,字符串可以用双引号引起来。 在这种情况下,我们不需要转义单引号。 因此,这种方法在使用许多带单引号的字符串值时非常有用。 在使用这么多行的INSERT / UPDATE脚本(其中列值带有单引号)时,这将非常有帮助。

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

结论

上述方法适用于AZURE和内部部署。

答案 11 :(得分:0)

双引号选项对我有帮助

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

答案 12 :(得分:0)

我遇到了同样的问题,但是我的不是基于SQL代码本身的静态数据,而是基于数据中的值。

此代码列出了数据库中的所有列名称和数据类型:

SELECT DISTINCT QUOTENAME(COLUMN_NAME),DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS

但是某些列名称实际上在列名称中嵌入了单引号!,例如...

[MyTable].[LEOS'DATACOLUMN]

要处理这些,我必须使用REPLACE函数以及建议的QUOTED_IDENTIFIER设置。否则,在动态SQL中使用该列时,将是语法错误。

SET QUOTED_IDENTIFIER OFF;
    SET @sql = 'SELECT DISTINCT ''' + @TableName + ''',''' + REPLACE(@ColumnName,"'","''") + ...etc
SET QUOTED_IDENTIFIER ON;

答案 13 :(得分:0)

STRING_ESCAPE 函数可用于较新版本的 SQL Server

答案 14 :(得分:-9)

string value = "Abhishek's";

value = Replace(value,"'","''");