在使用sql语句的时候,我们经常会遇到使用字符串变量的时候,比如说,查询,str:='select * from Table where Name='''+Name+'''';在.net里面使用sqlparameter,就不需要自己手动转换了,但是在做动态拼接sql时,总是或多或少的出现问题,今天就来说说单引号拼接的问题。
下面部分案例引用园子里的其他人的,在这里说一声谢谢,最后我接着写了下自己的总结。
就像上面写那句一样,我要想把name的值传到sql语句中间,还要带上单引号,形如str:='select * from Table where Name='JueJiang‘',就要考虑delphi中单引号的用法了。
首先,单引号必须是成对的,运行之后可能会出现’123''之类的情况,但是编译期写成str := '123''肯定是不行的。
第二,单引号的意义,成对的单引号,是标准的字符串赋值格式。在成对单引号之间的单引号,每两个相当于一个转换之后的单引号字符。还是举个例子说明一下吧。
str := ''''; str1 := '123'''; str2 := '123'+''; -------------------------------------
显示结果:
str:' str1:123' str2:123
去掉指定字符串格式的两个单引号,中间的部分,两个单引号代表一个'字符,加号运算符的效果相当于去掉中间的两个单引号。
使用变量也是一样:
str3 := '123'+Name; str4 := '123'''+Name; str5 := '123'''+Name+''; str6 := '123'''+Name+''''; ------------------------------------- 显示结果: str3:123456 str4:123'456 str5:123'456 str6:123'456'
通常sql语句中的拼接用的都是最后的一种情况。
补充一下,双引号,在delphi没有什么特殊的含义,就是普通的字符
str7 := '"123"'; ------------------------------------- 显示结果: str7:"123"
最后,还有sql语句的换行,换行就相当于是两个字符串的拼接了,需要使用加号连接起来。
str:='select * from Table '+ 'where Name='''+Name+'''';
总结如下:所谓单引号、双引号、三引号、四引号的都说的太多,或者他们对此了解的太少,没能弄懂其中的道理,就已‘三引号’、‘四引号’来看问题,反而将问题复杂化了。
通过我对上面案例的分析,以及该园子作者的说明,我们很容易理解一个道理:sql的动态拼接只有单引号,没有什么‘三引号’、‘四引号’之说,其中‘双引号’有两种解释
一个是shift+双引号键,产生("),另一个是连续两次单引号键,产生(''),在这里好似一样,而实际在sql编辑区是不同的,代码如下:
declare @sql varchar(200)
declare @t varchar(50)='JCZX/TX-02-1609102'
set @sql='select ordernumber ,''"xxx"'' as tt from lim_TestingOrders where ordernumber='''+@t+''''
print @sql
exec(@sql)
看代码中 ''""'' as tt ;最中间的是第一中方式产生的,他只是作为一种特殊字符而已,最外面的两层引号,是第二种方式产生的,作为转译符号。
总之:单引号在sql在才起真正的作用。他有两个作用:①字符串,②转译符;凡是在两个单引号内部的两个单引号都作为单引号处理,即内部的两个单引号有个是转译的作用,产生了一个单引号
上面sql其中会生成: select ordernumber,"xxx" from lim_TestingOrders where ordernumber='JCZX/TX-02-1609102'
希望对各位有困扰的人有帮助,也感谢各位在园子里努力的兄弟们。