но дайте мне ошибку, что недопустимое имя объекта # temp2

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 a.DocNum=@DocNum and d.ExpDate is not null
set @cnt=@cnt+1
end
select * from #temp2

но дает мне invalid object name #temp2ошибку.

sql-server,

-1

Ответов: 2


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. Вы можете создавать временные таблицы с помощью выбора * в ALTER PROCEDURE spMRI_TAG_try @ Docnum Int AS --Drop таблицы , если она существует IF OBJECT_ID ( N '# temp2' ) IS NOT NULL DROP TABLE # temp2 --create таблицы CREATE TABLE # temp2 ( cardname NVARCHAR ( 100 ), Docdate datetime , itemCode nvarchar ( 50 ), Dscription nvarchar ( 100 ), Количество числовое ( 19 , 6 ), ManBtchNum char ( 1 ), SalPackUn числовое ( 19 , 6 ), ExpDate datetime ) - Сделайте ввод INSERT INTO # temp2 SELECT a . CardName , a . DocDate , b . ItemCode , b . Dscription , b . Количество , c . ManBtchNum , c . SalPackUn , d . ExpDate ОТ OPDN ВНУТРЕННИЙ РЕГИСТРИРУЙТЕСЬ PDN1 Ь О . DocEntry = b . DocEntry INNER JOIN OITM гр ПО с . ItemCode = b . Артикул ВНУТРЕННИЙ РЕГИСТРИРУЙТЕСЬ OBTN д ВКЛ с . ItemCode = d . ItemCode и a . DocNum = @ DocNum и d . ExpDate не является нулевым - выведите SELECT * FROM # temp2 ... Проверьте этот синтаксис в msdn

0

Честно говоря, ваш SP - это один большой испорченный код :)

Я предлагаю вам переписать его вот так:

#temp2

Нет необходимости в цикле while (я даже не понимаю, как вы переключаетесь по строкам, в своем решении он будет писать одну и ту же строку «@count»), вы можете записывать все данные непосредственно в таблицу temp.

Вы получаете ошибку из-за отсутствия #temp2таблицы в момент, когда вы пытаетесь вставить, также нет проверки, если таблица уже существует.

Как было отмечено в ответе Каннана Кандасамы, еще один способ - использовать 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 a.DocNum=@DocNum and d.ExpDate is not null

SELECT * 
FROM #temp2
SQL-сервер,
Похожие вопросы