2016-10-15 2 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 

aber gibt mir eine invalid object name #temp2 Fehler.aber geben Sie mir Fehler, dass ungültiger Objektname # temp2

+2

Die Sitzung Aufruf dieser Prozedur sollte temporäre Tabelle '# temp2' genannt haben –

Antwort

0

erstellen temporäre Tabelle vor Ihrer while-Schleife:

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 

Zwei Punkte hier:

  1. nicht sicher, warum Sie Looping verwenden - Set basierte Ansätze versuchen. Sie können die meisten Probleme in der Serie basierte Abfragen lösen
  2. Sie Temp erstellen können Tabellen wählen Sie mit * in # temp2 ... Überprüfen Sie für diese Syntax in Msdn
0

Um ehrlich zu sein, Ihre SP eine ein großes Messed ist up-Code :)

ich schlage vor, Sie es wie folgt zu umschreiben:

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 

keine Notwendigkeit, eine while-Schleife (ich nicht einmal wissen, wie Sie durch die Reihen, in Ihrer Lösung schaltet wird es schreiben die gleiche Zeile die '@ count' mal, Sie können alle Daten direkt schreiben in der Tempentabelle.

Sie erhalten einen Fehler, weil es keine #temp2 Tabelle in dem Moment gibt, in dem Sie versuchen, einzufügen, auch gibt es keine Überprüfung, ob die Tabelle bereits existiert.

Wie in der Antwort von Kannan Kandasamy festgestellt, die eine weitere Möglichkeit ist SELECT * INTO #temp2 zu verwenden, kann es auf diese Weise erreicht werden:

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 
Verwandte Themen