tim*_*nil 882 sql t-sql sql-server delimiter single-quotes
我正在尝试将insert一些文本数据放入SQL Server9中的表中.
该文本包括单引号(').
我怎么逃避?
我尝试使用两个单引号,但它给我一些错误.
例如. insert into my_table values('hi, my name''s tim.');
Cᴏʀ*_*ᴏʀʏ 1284
单引号通过将它们加倍来进行转义,就像您在示例中向我们展示的那样.以下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
Run Code Online (Sandbox Code Playgroud)
value
==================
hi, my name's tim.
Run Code Online (Sandbox Code Playgroud)
小智 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
Run Code Online (Sandbox Code Playgroud)
Pau*_*McG 41
怎么样:
insert into my_table values('hi, my name'+char(39)+'s tim.')
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 17
引用的加倍应该是有效的,所以它对你不起作用是特殊的; 但是,另一种方法是在字符串周围使用双引号字符而不是单引号字符.也就是说,
insert into my_table values("hi, my name's tim.");
我们中的许多人都知道转义单引号的流行方法是将它们轻松加倍,如下所示。
PRINT 'It''s me, Arul.';
Run Code Online (Sandbox Code Playgroud)
我们将看看其他一些转义单引号的替代方法。
1. UNICODE 字符
39 是单引号的 UNICODE 字符。所以我们可以像下面那样使用它。
PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';
Run Code Online (Sandbox Code Playgroud)
2. QUOTED_IDENTIFIER
另一个简单且最佳的替代解决方案是使用 QUOTED_IDENTIFIER。当 QUOTED_IDENTIFIER 设置为 OFF 时,字符串可以用双引号括起来。在这种情况下,我们不需要转义单引号。因此,在使用大量带单引号的字符串值时,这种方式将非常有用。使用如此多行的 INSERT/UPDATE 脚本(其中列值具有单引号)将非常有帮助。
SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;
Run Code Online (Sandbox Code Playgroud)
结论
上述方法适用于 AZURE 和 On Premises 。
解决此问题的2种方法:
因为'您可以将它简单地在字符串中加倍,例如
select 'I''m happpy' -- will get: I'm happy
对于任何字符,您都不确定:在sql server中,您可以通过以下方式获取任何char的unicode: select unicode(':')
所以这种情况下你也可以 select 'I'+nchar(39)+'m happpy'
另外要注意的是它是否真的存储为经典的ASCII'(ASCII 27)或Unicode 2019(看起来相似但不相同).
这对于插入来说并不是一件大事,但它可能意味着选择和更新世界.
如果它是unicode值,那么在WHERE子句中转义'(例如,在blah ='Workers''sComp'中)将返回,就像你正在搜索的值一样,如果'in"Worker's Comp"实际上是unicode值.
如果您的客户端应用程序支持自由键,以及基于复制和粘贴的输入,它可能在某些行中是Unicode,在其他行中可能是ASCII!
确认这一点的一种简单方法是通过某种开放式查询来恢复您要搜索的值,然后将其复制并粘贴到notepad ++或其他一些支持unicode的编辑器中.
ascii值和unicode之间的不同外观对于眼睛应该是显而易见的,但是如果你倾向于肛门,它将在十六进制编辑器中显示为27(ascii)或92(unicode).