ALTER procedure [dbo].[mProcForQueryMM]
@everyTable varchar(50),
@temTable varchar(50)
as
  set nocount on
  declare @sql nvarchar(2000)
  declare @count varchar(500) 
  declare @itm varchar(500)
  declare @i int
  if (exists(select * from sysobjects where name=@everyTable and xtype='U') and @everyTable !=@temTable)
  begin
    if (not exists(select * from sysobjects where name =@temTable))
    begin
      set @sql='select [序号],[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] into '
      set @sql=@sql+@temTable+' from '+@everyTable+' where 1=0 '
      exec(@sql)
    end    set @sql='select @count=count(*) from '+@everyTable+' where [P/M]=''P'' or [P/M]=''M'''
    exec sp_executesql @sql,N'@count int output',@count output    set @i=1
    while @i<=@count
    begin
    set @sql='insert into '+@temTable+' select * from (select rn=row_number() over(order by [ItemNumber]),@itm=[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] from '+@everyTable+' )tb where rn='+cast(@i as varchar)
    exec sp_executesql @sql,N'@itm varchar(500) output',@itm output
    print @itm    set @i=@i+1
    end
end出错语句:
 set @sql='insert into '+@temTable+' select * from (select rn=row_number() over(order by [ItemNumber]),@itm=[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] from '+@everyTable+' )tb where rn='+cast(@i as varchar)'@itm=' 附近有语法错误。什么原因啊?

解决方案 »

  1.   

    @itm=[ItemNumber]你的这个是在动态语句中,你这里是需要输出还是要做什么。参考  sp_executesql
      

  2.   

      set @sql='insert into '+@temTable+' select * from (select rn=row_number() over(order by [ItemNumber]),@itm=[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] from '+@everyTable+' )tb where rn='+cast(@i as varchar)
    你将这段SQL打印出来,这么执行肯定是不行的。说说需求吧!
      

  3.   

    查出这条记录的同时:我要获取[ItemNumber]的部件代号,所以我想用个参数来输出得到,怎么改啊?
      

  4.   

    不能又查询又赋值的,这句改为如下,@itm另行赋值.set @sql='insert into '+@temTable+' select * from (select rn=row_number() over(order by [ItemNumber]),[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] from '+@everyTable+' )tb where rn='+cast(@i as varchar)
      

  5.   

    你可以直接在存储过程中设置一个output参数 
    或者将值存到一个变量中
      

  6.   

    动态插入【insert】里面不要获取那个值,另外来获取。declare @str varchar(1000)
    set @str = 'select @itm=... from ()t where ...'
    exec sp_executesql ...
      

  7.   

     输出参数 
    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 
      

  8.   

    三言两语讲不清楚,给你结果好了.ALTER procedure [dbo].[mProcForQueryMM]
    @everyTable varchar(50),
    @temTable varchar(50)
    as
      set nocount on
      declare @sql nvarchar(2000)
      declare @count varchar(500)  
      declare @itm varchar(500)
      declare @i int
      if (exists(select * from sysobjects where name=@everyTable and xtype='U') and @everyTable !=@temTable)
      begin
      if (not exists(select * from sysobjects where name =@temTable))
      begin
      set @sql='select [序号],[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] into '
      set @sql=@sql+@temTable+' from '+@everyTable+' where 1=0 '
      exec(@sql)
      end  set @sql='select @count=count(*) from '+@everyTable+' where [P/M]=''P'' or [P/M]=''M'''
      exec sp_executesql @sql,N'@count int output',@count output  set @i=1
      while @i<=@count
      begin
      set @sql='insert into '+@temTable+' select * from (select rn=row_number() over(order by [ItemNumber]),[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] from '+@everyTable+' )tb where rn='+cast(@i as varchar)
      exec sp_executesql @sql
     
      set @sql='select rn=row_number() over(order by [ItemNumber]),@itm=[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] from '+@everyTable
      exec sp_executesql @sql,N'@itm varchar(500) output',@itm output 
      
      print @itm  set @i=@i+1
      end
    end
      

  9.   

    向变量赋值的 SELECT 语句不能与数据检索操作结合使用。
    ????????
      

  10.   

    "不能又查询又赋值的,这句改为如下,@itm另行赋值."我在4楼就回答了哦.
      

  11.   

    哎,"不能又查询又赋值的,这句改为如下,@itm另行赋值."
    怎么另行赋值啊?
      

  12.   

    12楼的代码运行出错:“向变量赋值的 SELECT 语句不能与数据检索操作结合使用。

      

  13.   

    please try this,ALTER procedure [dbo].[mProcForQueryMM]
    @everyTable varchar(50),
    @temTable varchar(50)
    as
      set nocount on
      declare @sql nvarchar(2000)
      declare @count varchar(500)  
      declare @itm varchar(500)
      declare @i int
      if (exists(select * from sysobjects where name=@everyTable and xtype='U') and @everyTable !=@temTable)
      begin
      if (not exists(select * from sysobjects where name =@temTable))
      begin
      set @sql='select [序号],[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] into '
      set @sql=@sql+@temTable+' from '+@everyTable+' where 1=0 '
      exec(@sql)
      end  set @sql='select @count=count(*) from '+@everyTable+' where [P/M]=''P'' or [P/M]=''M'''
      exec sp_executesql @sql,N'@count int output',@count output  set @i=1
      while @i<=@count
      begin
      set @sql='insert into '+@temTable+' select * from (select rn=row_number() over(order by [ItemNumber]),[ItemNumber],[Description],[quantity],[um],[Res],[P/M],[Supplier],[BTO/BTS],[交货周期] from '+@everyTable+' )tb where rn='+cast(@i as varchar)
      exec sp_executesql @sql
     
      set @sql='select @itm=[ItemNumber] from '+@everyTable
      exec sp_executesql @sql,N'@itm varchar(500) output',@itm output 
      
      print @itm  set @i=@i+1
      end
    end