今天在写一个存储过程,写到查询某个表的语句的where条件时产生了一个不解的疑惑
这是我写的存储过程的其中一段代码
set @sql=@sql+' where is_zx='''+convert(nvarchar,@Is_zx)+''''
即声明一个叫@sql的语句,is_zx是一个列的名称,@Is_zx是传进来的一个参数
我想问的很简单,为什么参数的两边要加那么多个单引号,为何不能写成这样
set @sql=@sql+' where is_zx='+convert(nvarchar,@Is_zx)
跟编程语言一样简单明了,而且我也不明白上面那些单引号是那个对那个,只知道这么写才不会报错
不解望指教,谢了

解决方案 »

  1.   

    如果要在字符串里面加单引号,就需要转译,就是再多加一个单引号。' where is_zx=''' 这个就算一个字字符串。其值就是where is_zx='.
      

  2.   

    --兩個單引代表一個
    --print 就清楚了
    declare @sql varchar(200)
    declare @is_zx int
    select @sql='',@is_zx=2009
    set @sql=@sql+' where is_zx='''+convert(nvarchar,@Is_zx)+'''' 
    print @sql
    /*
     where is_zx='2009'
    */
      

  3.   

    由于是字符类型的所以在查询是必须是where is_zx= '字段值'的这种带有单引号的形式,儿楼主又吧这条语句放到了一个字符串变量里,所以,就得用转意单引号了,楼主可以试着将你的那个sql变量print出来看看,虽然带了三个单引号,但是实际打印出来的只有一个单引号,其他的单引号的作用是用来拼接字符串用的.
    一般的,三个连续的单引号可以标识一个实际的单引号,4个连续单引号标识一个空字符串,也就是''.
      

  4.   

    DECLARE @sql NVARCHAR(4000)
    SET @sql='SELECT * FROM TB'
    DECLARE @Is_zx NVARCHAR(4000)
    SET @Is_zx='A'
    set @sql=@sql+' where is_zx='''+convert(nvarchar,@Is_zx)+''''
    PRINT @sql/*
    SELECT * FROM TB where is_zx='A'
    */这样一看就清楚了,主要是字符型应该要用引号引起的,
      

  5.   

    你可以打印下你的Sql 语句,你会发现如果不加引号的话会是这样SELECT * FROM TB where is_zx=A,
      

  6.   

    其实你在执行exec(@sql) 之前
    执行 
    select @sql
    输出@sql的结果,再把结果copy到查询分析器中去执行,就会明白为什么。