我正在尝试将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.');
正如您在示例中向我们展示的那样,单引号通过将它们加倍来进行转义。以下 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' + char(39) + 's tim.')
我们中的许多人都知道转义单引号的流行方法是像下面这样轻松地将它们加倍。
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 和 On Premises。
加倍报价应该有效,所以奇怪的是它对您不起作用;但是,另一种方法是在字符串周围使用双引号字符,而不是单引号。IE,
insert into my_table values("hi, my name's tim."
);
解决此问题的 2 种方法:
因为'
你可以简单地在字符串中加倍它,例如
select 'I''m happpy'
-- 将得到:I'm happy
对于您不确定的任何字符:在 sql server 中,您可以通过select unicode(':')
(保留数字)获取任何字符的 unicode
所以这种情况你也可以select 'I'+nchar(39)+'m happpy'
另外要注意的另一件事是它是否真的存储为经典的 ASCII ' (ASCII 27) 或 Unicode 2019(看起来相似,但不一样)。
这对插入来说没什么大不了的,但它可能意味着选择和更新的世界。
如果它是 unicode 值,则在 WHERE 子句中转义 '(例如 where blah = 'Workers''s Comp')将返回,如果“Worker's Comp”中的 ' 实际上是Unicode 值。
如果您的客户端应用程序支持自由键以及基于复制和粘贴的输入,则它可能在某些行中是 Unicode,而在其他行中可能是 ASCII!
确认这一点的一种简单方法是执行某种开放式查询,该查询将带回您正在搜索的值,然后将其复制并粘贴到 notepad++ 或其他一些支持 unicode 的编辑器中。
ascii 值和 unicode 值之间的不同外观应该是显而易见的,但如果你靠近肛门,它会在十六进制编辑器中显示为 27 (ascii) 或 92 (unicode)。
双引号选项帮助了我
SET QUOTED_IDENTIFIER OFF;
insert into my_table values("hi, my name's tim.");
SET QUOTED_IDENTIFIER ON;
这应该工作
DECLARE @singleQuote CHAR
SET @singleQuote = CHAR(39)
insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
我有同样的问题,但我的不是基于 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;
STRING_ESCAPE函数可用于较新版本的 SQL Server
只需在要插入的任何内容之前插入一个'。它就像 sqlServer 中的转义字符
示例:当您有一个字段时,我很好。你可以这样做: UPDATE my_table SET row ='我很好。';
这应该有效:使用反斜杠并加上双引号
"UPDATE my_table SET row =\"hi, my name's tim.\";