SQL中单引号与双单引号的区别及使用场景咨询
嘿,这个问题我太熟悉了!刚好能给你讲清楚SQL Server里单引号和双单引号的区别,尤其是你用到的动态SQL场景:
单引号在SQL里最核心的作用就是包裹字符串字面量,用来明确告诉数据库:“这是一个字符串类型的值,不是对象名或者其他语法元素”。
就像你第一个常规查询里的写法:
SELECT * FROM [table] WHERE [column] = 'test'
这里的'test'就是用单引号把字符串test包起来,让SQL Server知道我们要匹配的是column列值等于字符串test的行。
而你第二个EXEC查询里的''test'',这是动态SQL场景下的单引号转义用法,本质是为了避免语法冲突。
为什么需要转义?因为当你用EXEC执行动态SQL时,整个SQL语句是被作为一个字符串参数传递的,这个字符串本身需要用单引号包裹。比如你写的:
EXEC(' SELECT * FROM [table] WHERE [column] = ''test'' ')
这里的外层单引号'是用来包裹整个要执行的SQL字符串的。如果里面的字符串值test直接写成'test',SQL Server会把第一个'当成字符串的开始,遇到test后面的'就会误以为整个SQL字符串结束了,剩下的内容就会触发语法错误。
所以,在动态SQL的字符串内部,要表示一个实际的单引号字符,就必须用**两个连续的单引号('')**来转义。当EXEC解析这个字符串时,会自动把''转换成单个',所以最终执行的SQL语句和你第一个常规查询完全一致,这就是为什么两次查询结果相同的原因。
比如你要查询的字符串里本身就包含单引号,比如I'm a SQL dev,常规查询里我们会写成:
SELECT * FROM [table] WHERE [column] = 'I''m a SQL dev'
这里的''就是用来表示字符串里的单引号'。如果把这个查询放到EXEC里,就需要再套一层转义:
EXEC(' SELECT * FROM [table] WHERE [column] = ''I''''m a SQL dev'' ')
当EXEC执行时,会先把外层的''转成',最终得到的执行语句就是SELECT * FROM [table] WHERE [column] = 'I''m a SQL dev',和常规查询的逻辑完全一致。
内容的提问来源于stack exchange,提问作者illimite




