其实规则很简单,就是如果字符串内部有一个单引号,需要转义成一对单引号,比如:declare @str varchar(20)
set @str=''''
select @str/*
-------------------- 
'
*/

解决方案 »

  1.   

    动态写法:字符串里的引号要输入两次
    如:
    显示 roy'select 'roy'''exec('select ''roy''''''')--动态写法,引号要输入=引号*2次,最外层的两个是不计算的
      

  2.   

    create table #(code varchar(20),value int)
    declare @sql varchar(200)
    set @sql='insert into # select ''AAA'',10' 
    -- AAA之前的一对单引号与之后的一对单引号分别代表一个单引号print @sql  --查看这个字符串的实际内容
    /*
    insert into # select 'AAA',10
    */exec(@sql)
    select * from #
    /*
    code                 value       
    -------------------- ----------- 
    AAA                  10
    */--如果需要insert一个值为"A'AA"的字符串,如下:
    set @sql='insert into # select ''A''''AA'',10'  
    --两层嵌套的字符串内部,一个单引号需要经过两次转义,于是变成了4个单引号print @sql  --查看这个字符串的实际内容
    /*
    insert into # select 'A''AA',10
    */exec(@sql)select * from #
    /*
    code                 value       
    -------------------- ----------- 
    AAA                  10
    A'AA                 10
    */
    drop table #
      

  3.   

    --动态sql语句基本语法
     
    1 :普通SQL语句可以用Exec执行 eg: Select * from tableName 
    Exec('select * from tableName') 
    Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: 
    declare @fname varchar(20) 
    set @fname = 'FiledName' 
    Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
    Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 
    declare @fname varchar(20) 
    set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s) -- 成功 
    exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s) -- 成功 
    exec sp_executesql @s -- 此句正确 3. 输出参数 
    declare @num int, 
    @sqls nvarchar(4000) 
    set @sqls='select count(*) from tableName' 
    exec(@sqls) 
    --如何将exec执行结果放入变量中? declare @num int, 
    @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num 
      

  4.   

    引用字符 加一对单引号. 'select * from tb where col=' + 'abcd' + ' and true'
    字符如果是变量值,再加两对单引号. 'select * from tb where col='''+ @colval+''' and true'
    如果字符是语句的结尾,加四个单引号.'select * from tb where col=''' +@colval+''''
    如果引用的是数值,则只要加一对: 'select * from tb where col='+ @intval +' and true'
    如果引用的数值,且为语句结尾,则后面的单引号也不要:'select * from tb where col=' +@intval
      

  5.   


    create proc query_org
    @org_role varchar(20)
    as
    begin
        declare @sql varchar(2000)
        set @sql = 'select * from t_org where ','+org_role+',' like ''%,'+@org_role+',%''' 
        exec (@sql)
    end--or:
    create proc query_org
    @org_role varchar(20)
    as
        select * from t_org where charindex(','+@org_role+',', ','+org_role+',')>0 
      

  6.   


    --第一个掉了引号:
    create proc query_org
    @org_role varchar(20)
    as
    begin
        declare @sql varchar(2000)
        set @sql = 'select * from t_org where '',''+org_role+'','' like ''%,'+@org_role+',%''' 
        exec (@sql)
    end
      

  7.   

    前面多加一个单引号即可
    lzselect ''''
    select ''''''运行看看,就懂了
      

  8.   


    不应该用 动态SQL ?