1、SQL语句中用"''"表示一个实际的"'"2、"N"是声明Unicode 数据

解决方案 »

  1.   

    viptiger(六嘎)
    是单引号,不过是连续的两个谢谢
    ============
    如果是连续的那么 是代表空吗
    libin_ftsafe(子陌红尘) 1、SQL语句中用"''"表示一个实际的"'"是2个连续的单引号代表一个 双引号吗
      

  2.   

    默认情况下,SQL中用'做为字符串定界符,而字符串中出现的',一律用两个''表示N表示后面的字符串使用unicode编码
      

  3.   

    +case when 代表什么 为什么还要前面的 “+”而且我没看出有什么循环的地方怎么取得col2,col3结果的
      

  4.   

    每个字段做判断+起来,所以要用+--这就是循环
    select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
    from syscolumns where id=object_id(@tbname)
      

  5.   

    这个语句的结果是+case when [col1]=2 then ',col1' else '' end+case when [col2]=2 then ',col2' else '' end+case when [col3]=2 then ',col3' else '' end+case when [col4]=2 then ',col4' else '' end后来您又用代替法 把+号代替为 ‘号 然后又把‘号代替为空 是吧stuff(@s,1,1,'') 是把第1个字符代替为引号吗
      

  6.   


    select @s='select @s='+stuff(@s,1,1,'')+' from ['+@tbname+'] set @s=stuff(@s,1,1,'''')'
    执行后结果为:
    =============
    select @s=case when [col1]=2 then ',col1' else '' end+case when [col2]=2 then ',col2' else '' end+case when [col3]=2 then ',col3' else '' end+case when [col4]=2 then ',col4' else '' end from [表] set @s=stuff(@s,1,1,'')
    =============这句具体什么意思
    exec sp_executesql @s,N'@s nvarchar(4000) out',@re out
      

  7.   

    那有"用代替法 把+号代替为 ‘号 "?因为生成的结果最前面有一个,
    所以用stuff(@s,1,1,'') 是把第1个字符替换掉
      

  8.   

    --你逐步理解就行了嘛(该看联机帮助的要看,不要偷懒)
    --这个循环的实质是生成处理语句
    select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
    from syscolumns where id=object_id(@tbname)--生成的处理结果是(加了格式化处理):
    +case when [col1]=2 then ',col1' else '' end
    +case when [col2]=2 then ',col2' else '' end
    +case when [col3]=2 then ',col3' else '' end
    +case when [col4]=2 then ',col4' else '' end
    --而我们最终要的处理语句是:
    select @s
    =case when [col1]=2 then ',col1' else '' end
    +case when [col2]=2 then ',col2' else '' end
    +case when [col3]=2 then ',col3' else '' end
    +case when [col4]=2 then ',col4' else '' end
    from 表--所以要用下面的语句处理一样(stuff的作用参考SQL联机帮助)
    select @s='select @s='+stuff(@s,1,1,'')+' from ['+@tbname+']'--这样将得到正确的处理语句,而执行那个处理语句得到的结果,会变成
    ,col2,col3
    这样的结果,所以要在处理语句最后加上一句
     set @s=stuff(@s,1,1,'''')'
      

  9.   

    楼主最主要的问题是懒,不是笨stuff,sp_executesql在联机帮助上都有详细说明,要学会查帮助
      

  10.   

    楼主最主要的问题是懒,不是笨stuff,sp_executesql在联机帮助上都有详细说明,要学会查帮助
    ==============
    zjcxc(邹建) 
    您冤枉我了
    我已经看了联机帮助 都已经查到  由于是E文的 所以看了个大概 由于项目很紧啊 没有时间允许我把帮助看一遍 我也想多学点东西啊这个东西要求今天弄完 我把您给我的放在查询分析器中执行了 但是结果的确为空我真的试了好几次啊!也许我真的好笨啊!
      

  11.   

    你可以装个中文的帮助嘛(E文不好别太勉强)SQL2000联机帮助
    http://www.microsoft.com/downloads/details.aspx?FamilyID=a6f79cb1-a420-445f-8a4b-bd77a7da194b&DisplayLang=zh-cn
      

  12.   

    好的1。先建一个表
    create table 表(col1 int,col2 int,col3 int,col4 int)
    insert 表 select 1,2,2,1
    这个是把代码拷贝到查询分析器中 然后建立的2。建立存储过程create proc p_qry
    @tbname sysname,  --要查的表名
    @re nvarchar(4000) out
    as
    set nocount on
    declare @s nvarchar(4000)
    set @s=''
    select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
    from syscolumns where id=object_id(@tbname)
    select @s='select @s='+stuff(@s,1,1,'')+' from ['+@tbname+'] set @s=stuff(@s,1,1,'''')'
    exec sp_executesql @s,N'@s nvarchar(4000) out',@re out
    go拷贝到查询分析器3。把如下语句拷贝到查询分析器declare @re nvarchar(4000)
    exec p_qry '表',@re out  --上面的调用少了表名
    select 结果=@re
    go============
    结果
    NUll
      

  13.   

    哈哈 我找到原因了exec p_qry '表',@re out  应该加上  N'表'  因为它是 Unicode
    ========但是 我试了别的表就不行了       我把表名改为 我们数据库中的表名Server: Msg 170, Level 15, State 1, Line 1
    Line 1: Incorrect syntax near 'when'.
      

  14.   

    我照你上面的测试了,不是null喔:
    结果     
    ---------
    col2,col3(所影响的行数为 1 行)
      

  15.   

    我的表结构表名 B_NeonatalDefectsNervous不同于 测试表的是
    有个
    TS字段 是不是影响啊还有个主建
      

  16.   

    存储过程改成这样:alter proc p_qry
    @tbname sysname,  --要查的表名
    @re nvarchar(4000) out
    as
    set nocount on
    declare @s nvarchar(4000)
    set @s=''
    select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
    from syscolumns where id=object_id(@tbname)
    select @s='select @s='+stuff(@s,1,1,'')+' from ['+@tbname+'] set @s=stuff(@s,1,1,'''')'
    exec sp_executesql @s,N'@s nvarchar(4000) out',@s out --输出为@S
    set @re=@s --要将输出@s赋给输出变量@re
    go
      

  17.   

    跟楼主的测试环境有关,他的测试环境应该是和SQL服务器环境不一样
    所以
    exec p_qry '表',@re out  
    传递给存储过程的表名是乱码
      

  18.   

    我现在加上  N'表'  就可以了但是怎么用其他的表不行有个TS字段 时间戳 还多了个主建
      

  19.   

    select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
    from syscolumns 
    where id=object_id(@tbname) 
       and name like 'xx%'  --加上对字段名的过滤条件
      

  20.   

    exec sp_executesql @s,N'@s nvarchar(4000) out',@re out解释:动态执行@s字符串语句,然后把@S变量字符串输出到@re变量中。从而可以用select @re来查看
      

  21.   

    我试了 and name like 'xx%'  --加上对字段名的过滤条件
    好像不起作用好像和我的字段名有关例如 BAB0336_2_27 中间有下划线
      

  22.   

    有的表可以 有个报错Server: Msg 105, Level 15, State 1, Line 1
    Unclosed quotation  before the character string ',BAB0336_2_5_2_8_2_3'.
    Server: Msg 170, Level 15, State 1, Line 1
    Line 1: Incorrect syntax near ',BAB0336_2_5_2_8_2_3'.
      

  23.   

    select @s=@s+'+case when ['+name+']=2 then '','+name+''' else '''' end'
    from syscolumns 
    where id=object_id(@tbname) 
       and name like 'xx%'  --加上对字段名的过滤条件后,print(@s) 看看,就知道是否字段太多
      

  24.   

    谢谢 zjcxc(邹建)大哥应该是的我想甩选一下有没有判断 一个字符串中 "_"  字符的个数的函数
      

  25.   

    declare @s varchar(100)
    set @s='as_dfa_dfa_daf'
    select [_个数]=len(@s)-len(replace(@s,'_',''))
      

  26.   

    谢谢 zjcxc(邹建) 大哥和其他一些热心的朋友们最后问一个问题能不能把存储过程写成
    返回一个字符串的  这样我想在调用时用 :exec p_qry '表'  完成调用可以吗
      

  27.   

    http://community.csdn.net/Expert/topic/3688/3688644.xml?temp=5.476016E-02又开一帖