sqlserver单引号转义字符

你好,你问的是SQL Server的单引号转义功能,对吗?上次我在一边帮助团队调试存储过程时,不小心掉进了陷阱。
让我告诉你我发现了什么。

在 SQL Server 中,括号确实是一个令人头疼的问题。
想想看,通常使用 SELECT 'Hello' 是最简单的,但是如果你将 O'Reilly 添加到字符串中,它会立即中断 - 因为它会认为第一个单引号是字符串的结尾,而 'Reilly' 之后的所有内容都会变得混乱。

2 02 3 年,我在为一家电商公司编写SQL报告时遇到了这个问题。
他们的前员工写的查询是用WHERE Name = 'O''Reilly'的方式编写的。
结果是“消息 2 4 5 ,级别 1 6 ,状态 1 ,第 1 0 行...意外的单引号。
”运行中途被报告。
我当时一看,哇!这些家伙实际上使用反引号作为转义字符,但 SQL Server 根本不识别它们!
然后我查了MSDN文档,发现官方建议是使用双括号''作为转义字符。
例如,O''Reilly,因此 SQL Server 会理解您想要放置实际的引号,而不是字符串的末尾。
这招确实管用。
修改后,他们的报告进展顺利。

但要注意一个细节:在SQL Server Management Studio中,如果直接输入'O''Reilly',可能会提示重复转义字符,但实际执行是没问题的。
有些开发环境或者工具可能对这种写法比较友好。
使用 N'' 前缀,例如 N'O''Reilly' 或仅使用 FOR XML PATH('') 方法进行转义。
我在 2 02 2 年的一次技术分享会上听说过这个,但自己没有尝试过。

我遇到的坑是,有时候转义写反了,比如‘O’‘Reilly’,中间有一个空格,这难免是错误的。
所以最安全的方法是:每次遇到引号时,就在其后面添加引号,就像 O''Reilly 一样,中间不要添加空格或其他符号。

最后提醒:此退出方法仅在SQL Server中使用。
如果跨数据库移动 SQL,则取决于目标数据库如何处理它。
例如,Oracle 使用双引号进行转义。

不管怎样,写SQL的时候,只要字符串中有单引号,就写双引号,像O''Reilly那样。
使用方法根据环境提示而定,但原理大体是正确的。

SQL Server日期时间与字符串之间的转换