说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

问个存储过程的小问题

编辑:说三道四文库 发布时间:2018-04-23 09:55
HTML文档下载 WORD文档下载 PDF文档下载
在存储过程里面建立了个表 @table,然后写了一个@sql,就是一个执行语句,
然后 exec(@sql),结果报错,说@table为声明。。。。

这是怎么回事呢?我明明声明了啊
急啊!!! 各位帮帮忙
贴code.
把语句贴出来

ALTER PROCEDURE [dbo].[spInventoryAge]
-- Add the parameters for the stored procedure here
@whID int = 0 ,
@ageOne smallint =30,
@ageTwo smallint =60,
@ageThree smallint =90
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    -- Insert statements for procedure here
declare @inventoryAge table
(
whID int,
whName nvarchar(30),
placeID smallint,
placeName nvarchar(30),
resourceID int,
resourceName nvarchar(198),
quantity decimal(18,4),
ageStage1 decimal(18,4),
ageStage2 decimal(18,4),
ageStage3 decimal(18,4),
ageStage4 decimal(18,4)
)

declare @MaterialAge table
(
resourceID int,
resourceName nvarchar(198),
quantity decimal(18,4),
ageStage smallint
)

declare @currentDate datetime
set @currentDate=GETDATE()

insert into @inventoryAge
select I.whID,w.whName,I.placeID,I.placeName,I.resourceID,I.resourceName,
   I.quantity,0,0,0,0
from dbo.vwInventory as I inner join
 dbo.Warehouse as W on I.whID=W.whID

insert into @MaterialAge
select EI.resourceID,EI.resourceName,sum(EI.quantity) as quantity,EI.ageStage
from 
(
select WI.resourceID,WI.resourceName,wi.quantity, case when @currentDate-W.entryDate<@ageOne then 1
when @currentDate-W.entryDate<@ageTwo then 2
when @currentDate-W.entryDate<@ageThree then 3
else 4 
end as ageStage 
from dbo.vwWarehouseEntryItem as WI inner join
dbo.WarehouseEntry as W ON W.entryID=WI.entryID
) EI
group by EI.resourceID,EI.resourceName,EI.ageStage

declare @updateSql varchar(max)
 
set @updateSql='';
select @updateSql=@updateSql+' ageStage'+LTRIM(M.ageStage)
   +'=max(case when ageStage='+LTRIM(M.ageStage)+' then quantity else 0 end)'
from @MaterialAge as M group by M.ageStage
exec('update @inventoryAge set '+@updateSql+' from @MaterialAge group by resourceID,resourceName')

set nocount off;

ALTER PROCEDURE [dbo].[spInventoryAge]
-- Add the parameters for the stored procedure here
@whID int = 0 ,
@ageOne smallint =30,
@ageTwo smallint =60,
@ageThree smallint =90
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    -- Insert statements for procedure here
declare @inventoryAge table
(
whID int,
whName nvarchar(30),
placeID smallint,
placeName nvarchar(30),
resourceID int,
resourceName nvarchar(198),
quantity decimal(18,4),
ageStage1 decimal(18,4),
ageStage2 decimal(18,4),
ageStage3 decimal(18,4),
ageStage4 decimal(18,4)
)

declare @MaterialAge table
(
resourceID int,
resourceName nvarchar(198),
quantity decimal(18,4),
ageStage smallint
)

declare @currentDate datetime
set @currentDate=GETDATE()

insert into @inventoryAge
select I.whID,w.whName,I.placeID,I.placeName,I.resourceID,I.resourceName,
   I.quantity,0,0,0,0
from dbo.vwInventory as I inner join
 dbo.Warehouse as W on I.whID=W.whID

insert into @MaterialAge
select EI.resourceID,EI.resourceName,sum(EI.quantity) as quantity,EI.ageStage
from 
(
select WI.resourceID,WI.resourceName,wi.quantity, case when @currentDate-W.entryDate<@ageOne then 1
when @currentDate-W.entryDate<@ageTwo then 2
when @currentDate-W.entryDate<@ageThree then 3
else 4 
end as ageStage 
from dbo.vwWarehouseEntryItem as WI inner join
dbo.WarehouseEntry as W ON W.entryID=WI.entryID
) EI
group by EI.resourceID,EI.resourceName,EI.ageStage

declare @updateSql varchar(max)
 
set @updateSql='';
select @updateSql=@updateSql+' ageStage'+LTRIM(M.ageStage)
   +'=max(case when ageStage='+LTRIM(M.ageStage)+' then quantity else 0 end)'
from @MaterialAge as M group by M.ageStage
exec('update @inventoryAge set '+@updateSql+' from @MaterialAge group by resourceID,resourceName')

set nocount off;
好了,贴出来了,等解答
你把变量表改成临时表吧
引用 7 楼  的回复:
你把变量表改成临时表吧


诶,怎么改???
好吧,可以了,变成有别的错误了

create table #MaterialAge table
    (
        resourceID int,
        resourceName nvarchar(198),
        quantity decimal(18,4),
        ageStage smallint
    )
谢谢了!

不过报错这个错误:消息 102,级别 15,状态 1,第 1 行
'ageStage4' 附近有语法错误。



ALTER PROCEDURE [dbo].[spInventoryAge]
    -- Add the parameters for the stored procedure here
    @whID int = 0 ,
    @ageOne smallint =30,
    @ageTwo smallint =60,
    @ageThree smallint =90
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    create table #inventoryAge 
    (
        whID int,
        whName nvarchar(30),
        placeID smallint,
        placeName nvarchar(30),
        resourceID int,
        resourceName nvarchar(198),
        quantity decimal(18,4),
        ageStage1 decimal(18,4),
        ageStage2 decimal(18,4),
        ageStage3 decimal(18,4),
        ageStage4 decimal(18,4)
    )
    
    create table #MaterialAge 
    (
        resourceID int,
        resourceName nvarchar(198),
        quantity decimal(18,4),
        ageStage smallint
    )
    
    declare @currentDate datetime
    set @currentDate=GETDATE()
    
    insert into #inventoryAge
        select I.whID,w.whName,I.placeID,I.placeName,I.resourceID,I.resourceName,
               I.quantity,0,0,0,0
        from dbo.vwInventory as I inner join
             dbo.Warehouse as W on I.whID=W.whID
    
    insert into #MaterialAge
        select EI.resourceID,EI.resourceName,sum(EI.quantity) as quantity,EI.ageStage
        from 
        (
                select   
                     WI.resourceID,WI.resourceName,wi.quantity, 
                     case when @currentDate-W.entryDate<@ageOne then 1
                     when @currentDate-W.entryDate<@ageTwo then 2
                     when @currentDate-W.entryDate<@ageThree then 3
                     else 4  end as ageStage 
                from    
                     dbo.vwWarehouseEntryItem as WI inner join
                     dbo.WarehouseEntry as W ON W.entryID=WI.entryID
        ) EI
        group by EI.resourceID,EI.resourceName,EI.ageStage
    
    declare @updateSql varchar(max)
             
    set @updateSql='';
    select @updateSql=@updateSql+' ageStage'+LTRIM(M.ageStage)
           +'=max(case when ageStage='+LTRIM(M.ageStage)+' then quantity else 0 end)'
        from @MaterialAge as M group by M.ageStage
    --打印出来看看   
    print @updateSql
    exec('update @#inventoryAge set '+@updateSql+' 
          from @MaterialAge group by resourceID,resourceName')

    set nocount off;
引用 12 楼  的回复:
SQL code


ALTER PROCEDURE [dbo].[spInventoryAge]
    -- Add the parameters for the stored procedure here
    @whID int = 0 ,
    @ageOne smallint =30,
    @ageTwo smallint =60,
    @ageThree smalli……


打印出来是这个:
 ageStage2=max(case when ageStage=2 then quantity else 0 end) ageStage4=max(case when ageStage=4 then quantity else 0 end)
诶,12L 不解答我的问题了么。。。泪奔。。。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘