create procedure usp_getitem 
(
   @olditemvalue int output,
   @item   varchar(20),
   @empno varchar(20),
   @periodname varchar(20)
)
as
  declare @sqlstr nvarchar(200),
   @sqlstr =  'select  '+ @olditemvalue + '=' + @item + 'from sal_base where empno = '+ '''+@empno+'''+ 'and '+ '''+@periodname+'''
   exec(@sqlstr)
return @olditemvalue
我想得到传入的 @item的列值,用@olditemvalue 返回不知道怎么写?

解决方案 »

  1.   

    楼主这存储过程有问题呀。
    @olditemvalue int output ?
      

  2.   

    @sqlstr =  'select  '+ @olditemvalue + '=' + @item + 'from sal_base where empno = '+ '''+@empno+'''+ 'and '+ '''+@periodname+''' 语句中的@olditemvalue非@olditemvalue int output
      

  3.   

    哎,麻烦大家看清楚贴在回啊,我的@item是传入的列,我想用@olditemvalue 得到这个列的值再返回这个值,怎么都是苗一下就回帖的
      

  4.   


    create procedure usp_getitem 

      @olditemvalue int output, 
      @item  varchar(20), 
      @empno varchar(20), 
      @periodname varchar(20) 

    as 
      declare @sqlstr nvarchar(200), 
      @sqlstr =  N'select  '+ @olditemvalue + '=' + @item + 'from sal_base where empno = '+ '''+@empno+'''+ 'and '+ '''+@periodname+''' 
      exec SP_EXECUTESQL  @sqlstr,N'@olditemvalue INT,@item VARCHAR(20)',@olditemvalue OUTPUT,@ITEM
    return @olditemvalue 这样试试?动态执行还不太懂
      

  5.   

    你想用@olditemvalue 得到@item列的值再返回这个值,但你这个列难道只有一行数据?如果有多行数据怎么办?
    如果不考虑有多行记录的话用底下的试下:create procedure usp_getitem 

      @olditemvalue int output, 
      @item  varchar(20), 
      @empno varchar(20), 
      @periodname varchar(20),

    as 
    begin
      declare @sqlstr nvarchar(200)
      create table #A(OldItemvalue int)
      @sqlstr =  'select  '+ @olditemvalue + '=' + @item + 'from sal_base where empno = '+ '''+@empno+'''+ 'and '+ '''+@periodname+''' 
      insert into #A
      exec(@sqlstr) 
      select @olditemvalue = OldItemvalue from #A
      return
    end
      

  6.   

    你理解错了楼主的意思吧。他要的是@item所对应的列的值,而又不是传进来的参数
      

  7.   

    必须用 SP_EXECUTESQL   的方法才能返回值,用Exec()不行。具体方法前面有人说明了,我就不写了。
      

  8.   

    @sqlstr =  'select  '+ @olditemvalue + '=' + @item + 'from sal_base where empno = '+ '''+@empno+'''+ 'and '+ '''+@periodname+'''
    我的这一行总是有错误能不能帮忙看看,这个存储过程是还有问题的
      

  9.   


    @sqlstr =  'select  '+ @olditemvalue + ' = ' + @item + ' from sal_base where empno = ' + '''' + @empno + '''' + ' and '+ '''' + @periodname + '''' 你在“+ ' from ”的地方from前面最好要加个空格的,要不然有可能会和前面的变量重新组成一个字符串了,这样不就不对了?
      

  10.   

    1, 如果要用动态参数接收传出的值,你在SQL中声明的那人变量要在引号内,然后执行时外面用一个输出参数匹配
    2,用SP_EXECUTESQL
    3,SQL语句的变量长度最好定义长一点,稍不注意就超过200了,而且要是nvarchar的
    可大致修改一下(没有调试)
    create procedure usp_getitem 

      @olditemvalue int output, 
      @item  varchar(20), 
      @empno varchar(20), 
      @periodname varchar(20) 

    as 
      declare @sqlstr nvarchar(400), 
      @sqlstr =  N'select  top 1 @olditemvalue = item from sal_base where empno = '+ '''+@empno+'''+ 'and periodname = '+ '''+@periodname+''' + 'and item='+ '''+@item +''' 
      exec SP_EXECUTESQL  @sqlstr,@olditemvalue INT OUTPUT
      -- SELECT @olditemvalue
      

  11.   

    @olditemvalue = item 
    -》
    @olditemvalue = olditem
      

  12.   

    别人这里没有对应的表,怎么调试啊!自己稍微修改一下就可以了
    下面这个没有语法错误了,试一下create procedure usp_getitem 

      @olditemvalue int output, 
      @item  varchar(20), 
      @empno varchar(20), 
      @periodname varchar(20) 

    as 
      declare @sqlstr nvarchar(400), 
      @sqlstr =  N'select  top 1 @olditemvalue = olditem from sal_base where empno = '''+@empno+''' and periodname = '''+@periodname+''' and item='''+@item +'' 
      exec SP_EXECUTESQL  @sqlstr,@olditemvalue INT OUTPUT
      -- SELECT @olditemvalue
      

  13.   

    没有啊,我就是想传入一个sal_base中的列,然后再传入两个where后面的值,都是sal_base中的列值,不过是知道列名的。然后在得到这个传入列的列值。
    select a from sal_base where b = 'g' and c= 'f'
    其中 a,g,f是传入的值,我就是想得到a的值,只有一行数据。
      

  14.   

    理解错了,你的item参数指的是列名啊!那修改一下。SQL语句中的@olditemvalue和外面参数@olditemvalue不是一回事啊create procedure usp_getitem 

      @olditemvalue int output, 
      @item  varchar(20), 
      @empno varchar(20), 
      @periodname varchar(20) 

    as 
      declare @sqlstr nvarchar(400), 
      @sqlstr =  N'select  top 1 @olditemvalue = ' + @item + ' from sal_base where empno = '''+@empno+''' and periodname = '''+@periodname + '' 
      exec SP_EXECUTESQL  @sqlstr,@olditemvalue INT OUTPUT
      -- SELECT @olditemvalue
      

  15.   

    .......我看到现在非常莫名,也不知道为什么大家都跟着一起转,既然
    a,g,f都是传入的,那你select a还用条件干嘛啊?
      

  16.   

    不是,如果a,g,f都是传入的值,当然直接用SQL语句查询出来赋给变量就行了,现在人家的a不是输入的value, 是column name, 无法直接下SQL,要用动态查询
      

  17.   


    声明本人对于存储过程认识很肤浅
    set @sqlstr =  'select  ' + @item + 'from sal_base where empno = '+ '''+@empno+'''+ 'and '+ '''+@periodname+''' 
    @item 为列名(数据表中的字段名) 
      

  18.   

    create procedure usp_getitem 

      @olditemvalue int output, 
      @item  varchar(20), 
      @empno varchar(20), 
      @periodname varchar(20)

    as 
    begin
      declare @sqlstr nvarchar(200)
      create table #A(OldItemvalue int)
      set @sqlstr =  'select  '+ @olditemvalue + ' = ' + @item + ' from sal_base where empno = ' + '''' + @empno + '''' + ' and '+ '''' + @periodname + ''''   insert into #A
      exec(@sqlstr) 
      select @olditemvalue = OldItemvalue from #A
      return
    end
      

  19.   


    create procedure usp_getitem 

      @olditemvalue int output, 
      @item  varchar(20), 
      @empno varchar(20), 
      @periodname varchar(20),

    as 
    begin
      declare @sqlstr nvarchar(200)
      create table #A(OldItemvalue int)
      @sqlstr =  'select  '+ @olditemvalue + '=' + @item + 'from sal_base where empno = '+ '''+@empno+'''+ 'and '+ '''+@periodname+''' 
      print @sqlstr--把动态语句print出来看下是不是写错了
      insert into #A  exec(@sqlstr) --这里是把动态语句执行的结果插入临时表里面
      select @olditemvalue = OldItemvalue from #A
      return
    end