执行以下存储过程出错
exec jysc 'CQ0901,2,CQ0902,6,BJ0908,10'提示的出错信息为:
服务器: 消息 128,级别 15,状态 1,行 1
在此上下文中不允许使用 'CQ0901'。此处只允许使用常量、表达式或变量。不允许使用列名。
服务器: 消息 128,级别 15,状态 1,行 1
在此上下文中不允许使用 'CQ0902'。此处只允许使用常量、表达式或变量。不允许使用列名。
服务器: 消息 128,级别 15,状态 1,行 1
在此上下文中不允许使用 'BJ0908'。此处只允许使用常量、表达式或变量。不允许使用列名。(所影响的行数为 0 行)存储过程的本意是将以上参数保存到临时表#tab中,格式如下
 bh     sl
CQ0901  2
CQ0902  6
BJ0908  10
ALTER procedure  [dbo].[jysc]
@fld_ddh varchar(3000)
as
create table #tab(bh varchar(30) null,sl float null)
declare @sql varchar(1000),@bh varchar(30),@i_len int,@i_len2 floatif right(@fld_ddh,1)<>','
set @fld_ddh=@fld_ddh+','WHILE CHARINDEX(',',@fld_ddh)>0
BEGIN
        set @i_len=CHARINDEX(',',@fld_ddh)
        set @i_len2=charindex(',',@fld_ddh,@i_len)
        set @bh=left(@fld_ddh,@i_len-1)        
        set @sl=substring(@fld_ddh,@i_len+1,@i_len2-@i_len-1)
        set @fld_ddh=right(@fld_ddh,len(@fld_ddh) - @i_len2)
        set @sql='INSERT INTO #tab(bh,sl) VALUES (@bh,@sl)'
        exec(@sql)
END
select * from #tab

解决方案 »

  1.   

    declare   @sql   varchar(1000),@bh   varchar(30),@i_len   int,@i_len2   float
    set @sql=''
    set @bh=''
    set @i_len=0
    set @i_len2=0然后@bh,@sl这两个在哪?没有声明
      

  2.   

    set   @sql= 'INSERT   INTO   #tab(bh,sl)   VALUES   (@bh,@sl) '你把这个SQL
    PRINT出来看看
      

  3.   

    set   @sql= 'INSERT   INTO   #tab(bh,sl)   VALUES   ('+@bh'+','+@sl+') ' 这样就行了
      

  4.   

    上面我发的那个错了,更正
    set   @sql= 'INSERT   INTO   #tab(bh,sl)   VALUES   ('+@bh+','+@sl+') ' 
      

  5.   

    还是差东西,呵呵。怎么修改自己的回复啊?
    set   @sql= 'INSERT   INTO   #tab(bh,sl)   VALUES   ('''+@bh+''','''+@sl+''') ' 
    在过程里建临时表?我觉得不如用表变量好一点
      

  6.   


    create procedure jysc
     @fld_ddh   varchar(3000)
    as
    if  right(@fld_ddh,1) <> ','
       set @fld_ddh=@fld_ddh+',' 
    declare @bh varchar(30),@sl varchar(10)
    set @bh=''
    set @sl=''
    create   table   #tab(bh   varchar(30)   null,sl   varchar(10)   null)
    while CHARINDEX( ',',@fld_ddh)> 0
    begin
        set @bh=left(@fld_ddh,CHARINDEX( ',',@fld_ddh)-1)
        set @fld_ddh=right(@fld_ddh,len(@fld_ddh)-CHARINDEX( ',',@fld_ddh))
        set @sl=left(@fld_ddh,CHARINDEX( ',',@fld_ddh)-1)
        set @fld_ddh=right(@fld_ddh,len(@fld_ddh)-CHARINDEX( ',',@fld_ddh))
        insert into #tab select @bh,@sl
    end
    select * from #tab
    exec dbo.jysc 'CQ0901,2,CQ0902,6,BJ0908,10'
    /*(所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)bh                             sl         
    ------------------------------ ---------- 
    CQ0901                         2
    CQ0902                         6
    BJ0908                         10(所影响的行数为 3 行)*/drop procedure jysc
    drop table #tab