我试图insert一些文本数据到表中SQL服务器9.
insert
文本包含一个单引号'。
'
我该怎么逃避?
我尝试使用两个单引号,但它给我带来了一些错误。
eg.insert into my_table values('hi, my name''s tim.');
insert into my_table values('hi, my name''s tim.');
不如:
insert into my_table values('hi, my name' + char(39) + 's tim.')
单引号通过将它们加倍来转义,就像您在示例中向我们展示的那样。以下SQL说明了此功能。我在SQLServer 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.
双引号应该起作用,所以它对你不起作用是很奇怪的;然而,另一种选择是在字符串周围使用双引号字符,而不是单引号。即,
insert into my_table values("hi, my name's tim.");
insert into my_table values("hi, my name's tim."
如果用另一个单引号转义您的单引号不适合您(就像我最近的REPLACE()查询一样),您可以在查询之前使用SET QUOTED_IDENTIFIER OFF,然后在查询之后使用SET QUOTED_IDENTIFIER ON。
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
另外一件需要注意的事情是它是否真的存储为经典ASCII'(ASCII 27)或Unicode 2019(看起来相似,但不相同)。如果您的客户端应用程序支持自由键,以及基于复制和粘贴的输入,则某些行可能是Unicode,而其他行可能是ASCII!确认这一点的一种简单方法是执行某种开放式查询,该查询将带回您正在搜索的值,然后将其复制并粘贴到记事本++或其他Unicode支持编辑器中。
这应该能行
DECLARE @singleQuote CHARSET @singleQuote = CHAR(39) insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
2种方法来解决这个问题:
对于',您可以简单地将其在字符串中加倍,例如。select 'I''m happpy'--会得到:I'm happy
select 'I''m happpy'
I'm happy
对于任何你不确定的字符:在sql服务器中,你可以通过select unicode(':')获得任何字符的Unicode(你保留数字)
select unicode(':')
所以在这种情况下,你也可以select 'I'+nchar(39)+'m happpy'
select 'I'+nchar(39)+'m happpy'
这应该工作:使用反斜杠并放一个双引号
"UPDATE my_table SET row =\"hi, my name's tim.\";
只需在要插入的任何内容之前插入'。它将类似于sqlServer中的转义字符
示例:当你有一个字段为,挺好的。你可以这样做:更新my_tableSET row='我很好';
以下语法将只转义一个引号:
SELECT ''''
结果将是一个单引号。可能对创建动态SQL很有帮助:)。
我们中的许多人都知道,逃离单引号的流行方法是通过把它们加倍轻松地像下面这样。
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。
双引号选项帮助了我
SET QUOTED_IDENTIFIER OFF;insert into my_table values("hi, my name's tim.");SET QUOTED_IDENTIFIER ON;
我也有同样的问题,但我的问题不是基于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,"'","''") + ...etcSET QUOTED_IDENTIFIER ON;
STRING_ESCAPE功能可用于较新版本的SQLServer