2016-10-15 49 views
-1
Alter procedure spMRI_TAG_try 
@DocNum int 
as 
declare @cnt int 
declare @count int 
declare @cardname nvarchar(100) 
declare @Docdate datetime 
declare @itemCode nvarchar(50) 
declare @Dscription nvarchar(100) 
declare @Quantity numeric(19,6) 
declare @ManBtchNum char(1) 
declare @SalPackUn numeric(19,6) 
declare @ExpDate datetime 
begin 
set @cnt = 1 
select @Count = pdn1.Quantity/OITM.SalPackUn from pdn1 inner join OITM on pdn1.ItemCode=OITM.ItemCode 
while @cnt <= @count 
insert into #temp2 values(@cardname,@DocDate,@itemcode,@Dscription,@Quantity,@ManBtchNum,@SalPackUn,@ExpDate) 
select @cardname = a.CardName,@DocDate=a.DocDate,@itemcode=b.ItemCode,@Dscription=b.Dscription,@Quantity=b.Quantity,@ManBtchNum=c.ManBtchNum,@SalPackUn=c.SalPackUn,@ExpDate=d.ExpDate 
from OPDN a inner join PDN1 b on a.DocEntry = b.DocEntry inner join OITM c on c.ItemCode = b.ItemCode inner join OBTN d on c.ItemCode = d.ItemCode and [email protected] and d.ExpDate is not null 
set @[email protected]+1 
end 
select * from #temp2 

但给我一个invalid object name #temp2错误。,但给我错误,无效的对象名称#temp2

+2

调用这个程序。会议应临时表名为'#temp2' –

回答

0

while循环之前创建临时表:

create table #temp2 (Cardname ...) 
while @cnt <= @count 
insert into #temp2 values(@cardname,@DocDate,@itemcode,@Dscription,@Quantity,@ManBtchNum,@SalPackUn,@ExpDate) 
select @cardname = a.CardName,@DocDate=a.DocDate,@itemcode=b.ItemCode,@Dscription=b.Dscription,@Quantity=b.Quantity,@ManBtchNum=c.ManBtchNum,@SalPackUn=c.SalPackUn,@ExpDate=d.ExpDate 

两点这里:

  1. 不知道为什么你正在使用循环 - 尝试设置基础的方法。你可以解决大部分的问题,基于集合的查询
  2. 您可以使用select *为#TEMP2创建临时表...检查是否有语法在MSDN
0

说实话你的SP是一个大搞砸达代码:)

我建议你重写它是这样的:

ALTER PROCEDURE spMRI_TAG_try 
    @DocNum int 
AS 
--Drop table if it exists 
IF OBJECT_ID(N'#temp2') IS NOT NULL DROP TABLE #temp2 
--create table 
CREATE TABLE #temp2 (
    cardname nvarchar(100), 
    Docdate datetime, 
    itemCode nvarchar(50), 
    Dscription nvarchar(100), 
    Quantity numeric(19,6), 
    ManBtchNum char(1), 
    SalPackUn numeric(19,6), 
    ExpDate datetime 
) 
--Make the insertion 
INSERT INTO #temp2 
SELECT a.CardName, 
     a.DocDate, 
     b.ItemCode, 
     b.Dscription, 
     b.Quantity, 
     c.ManBtchNum, 
     c.SalPackUn, 
     d.ExpDate 
FROM OPDN a 
INNER JOIN PDN1 b 
    ON a.DocEntry = b.DocEntry 
INNER JOIN OITM c 
    ON c.ItemCode = b.ItemCode 
INNER JOIN OBTN d 
    ON c.ItemCode = d.ItemCode and [email protected] and d.ExpDate is not null 
--output 
SELECT * 
FROM #temp2 

不需要while循环(我甚至无法理解你将如何通过行切换,在您的解决方案,将写同一行'@count'次),你可以写所有的数据可怕在临时表中。

由于您试图插入时没有#temp2表,您会收到错误,如果表已存在,也不会检查。

正如在回答通过卡纳安Kandasamy指出,一个更加办法是使用SELECT * INTO #temp2,可以实现这种方式:

ALTER PROCEDURE spMRI_TAG_try 
    @DocNum int 
AS 

IF OBJECT_ID(N'#temp2') IS NOT NULL DROP TABLE #temp2 

SELECT a.CardName, 
     a.DocDate, 
     b.ItemCode, 
     b.Dscription, 
     b.Quantity, 
     c.ManBtchNum, 
     c.SalPackUn, 
     d.ExpDate 
INTO #temp2 
FROM OPDN a 
INNER JOIN PDN1 b 
    ON a.DocEntry = b.DocEntry 
INNER JOIN OITM c 
    ON c.ItemCode = b.ItemCode 
INNER JOIN OBTN d 
    ON c.ItemCode = d.ItemCode and [email protected] and d.ExpDate is not null 

SELECT * 
FROM #temp2 
相关问题