首页 > 技术文章 > 关于sql 拼接字符串的问题

zhaosw 2016-11-22 10:01 原文

在使用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'

希望对各位有困扰的人有帮助,也感谢各位在园子里努力的兄弟们。

 

  

推荐阅读