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

如何在SQL Server中转义单引号?,sql,sql-server,tsql,delimiter,single-quotes,Sql,Sql Server,Tsql,Delimiter,Single Quotes,我正在尝试在sqlserver9中向表中插入一些文本数据 文本包含一个单引号(') 我怎么才能逃脱呢 我尝试使用两个单引号,但它给我带来了一些错误 例如,插入my_表中的值(“嗨,我的名字叫蒂姆”)如何: insert into my_table values('hi, my name' + char(39) + 's tim.') 单引号是通过将它们加倍来转义的,正如您在示例中所示。下面的SQL说明了此功能。我在SQL Server 2008上测试了它: DECLARE @my_table

我正在尝试
sqlserver
9中向表中插入一些文本数据

文本包含一个单引号(')

我怎么才能逃脱呢

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

例如,
插入my_表中的值(“嗨,我的名字叫蒂姆”)

如何:

insert into my_table values('hi, my name' + char(39) + '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
结果
报价单的加倍应该是有效的,所以奇怪的是它对你不起作用;但是,另一种方法是在字符串周围使用双引号字符,而不是单引号字符。即


插入my_表值(“嗨,我叫tim。”

如果用另一个单引号转义单引号对您不起作用(就像我最近的一次
REPLACE()
查询不起作用一样),您可以在查询之前使用
SET QUOTED\u IDENTIFIER OFF
,然后在查询之后使用
SET QUOTED\u 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值,则转义WHERE子句中的“in”(例如WHERE blah='Workers's Comp')将返回,如果“Worker's Comp”中的“in”实际上是unicode值,则您正在搜索的值不存在。

如果您的客户端应用程序支持自由键以及基于复制和粘贴的输入,则某些行中可能是unicode,还有其他人

确认这一点的一个简单方法是,执行某种开放式查询,返回您正在搜索的值,然后将其复制并粘贴到记事本++或其他支持unicode的编辑器中。

ascii值和unicode值之间的外观差异应该显而易见,但是如果你倾向于肛门,它将在十六进制编辑器中显示为27(ascii)或92(unicode)。

这应该可以

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

解决此问题的两种方法:


对于
,您只需在字符串中将其加倍即可,例如。
选择“我快乐”
——将获得:
我快乐


对于您不确定的任何字符:在sql server中,您可以通过
选择unicode(“:”)
获得任何字符的unicode(保留数字)


因此,在这种情况下,您也可以选择“I”+nchar(39)+“m happy”

这应该有效:使用反斜杠并加上双引号

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

只需在要插入的任何内容之前插入一个'。它将类似于sqlServer中的转义字符

例如: 当你有一个字段作为,我很好。 你可以做:
更新我的表格集行='I'm fine'

以下语法将只保留一个引号:

SELECT ''''
结果将是一个单一的报价。可能对创建动态SQL非常有帮助:)。

我们中的许多人都知道,常用的单引号转义方法是像下面这样简单地将它们加倍

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

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

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;
1.UNICODE字符

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

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

2.u标识符

另一个简单且最好的替代解决方案是使用带引号的_标识符。 当QUOTED_IDENTIFIER设置为OFF时,字符串可以用双引号括起来。 在这种情况下,我们不需要转义单引号。 因此,当使用大量带单引号的字符串值时,这种方法将非常有用。 当使用如此多的插入/更新脚本行,其中列值带有单引号时,这将非常有用

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

结论


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

双引号选项帮助了我

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_标识符设置。否则,在动态SQL中使用该列时,将出现语法错误

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

该功能可用于较新版本的SQL Server

“它引发了一些错误”--这些错误是什么?是的,因为在MSSQL中插入单引号的正确方法是将它们加倍。你给我们展示的例子应该是有效的。如何进行此SQL查询,使用哪种语言?或者它在SQL Server Management Studio中?可能与的重复。我在错误的位置查找以修复我的问题。这毕竟不是一个角色逃避的问题。我的问题是数据长度超出了限制。谢谢你让我放心,两次使用单引号是转义字符的正确方法。因此,如果我有一篇包含10k个单词的文本,我就必须替换所有文本?@ViniciusLima:简短的回答是肯定的。当然,这会随着存储数据的技术而改变。如果你使用的是ORM,它会帮你。如果要手动生成SQL命令,则需要使用该语言的“准备好的语句”功能。如果你在ManagementStudio中进行,那么你必须进行替换。两个单引号一个。['']=>[']我是it界的新手,但很聪明:也可以:)通常我使用双倍增长的方法,但当我生成动态SQL,然后在多个服务器和数据库上运行时,这个解决方案对我有效,而在一个特定的情况下,双倍增长没有效果。谢谢你!在计算机上引用视图和索引时要小心