#sql-server
#sql-сервер
Вопрос:
Я пытаюсь создать хранимую процедуру, которая передает значения из инструкции select соединенных таблиц в качестве параметров другой хранимой процедуре внутри, чтобы создать возврат кредита для возвращенной покупки, которые назначаются в предложении WHERE соединенных таблиц ( @RANO
и @returndate
). Я хочу передать много клиентов (as @Customer
) из объединенных таблиц в хранимую процедуру CreateManCreditHDFromReturn
, но она выбирает первое @RANO
в WHERE
предложении оператора joined!
Как я могу передать несколько значений (например, клиенты, подразделения, …) из всех RANOS в предложении where объединенной таблицы?
Примечание: RANO означает авторизацию возврата возвращенной покупки.
ALTER PROCEDURE [dbo].[CreateEllieAutoCreditHDFromReturn]
AS
BEGIN
DECLARE @ARReason nVarChar(5),
@DocumentDate Datetime,
@ARDocumentType VarChar(5),
@TRANSACTIONID INT,
@TIMELASTMOD DATETIME,
@USERIDLASTMOD nvarchar(5),
@CompanyCode nVarChar(10),
@Customer nVarChar(10),
@Division nVarChar(5),
@Warehouse nVarChar(10),
@Salesman1 nVarChar(10),
@Currency nVarChar(3),
@ReturnNo int,
@RANO int,
@Style nvarchar(15),
SELECT @Pkey = @CompanyCode = rh.companycode,
@Customer = rh.CUSTOMER,
@Division = rh.DIVISION,
@Warehouse = rh.WAREHOUSE,
@Salesman1 = rh.SALESMAN1,
@Currency = rh.CURRENCY,
@ReturnNo = rh.returnno,
@RANO = rh.RANO
FROM
ReturnDetail rd
INNER JOIN
ReturnHeader rh ON rh.RETURNNO = rd.RETURNNO
WHERE
rh.RETURNDATE >= '2020-03-27 00:00:00'
AND rh.RETURNDATE < '2020-03-28 00:00:00'
AND rd.RANO IN (79383, 79820)
AND rd.ARDOCUMENTNOCOMPANY = 0
SET @ARReason = 'RM'
SET @ARDocumentType = 'RCRDT'
SET @DocumentDate = GETDATE()
SET @TRANSACTIONID = 0
SET @TIMELASTMOD = GETDATE()
SET @USERIDLASTMOD = 'WSchan'
SET @ReferenceNo = 0
DECLARE @CurrDocumentNo Int,@CurrDocumentNoCompany Int
EXEC dbo.CreateManCreditHDFromReturn
@CompanyCode,
@ARReason,
@Customer,
@Division,
@Warehouse,
@Salesman1,
@Currency,
@DocumentDate,
@ReferenceNo,
@ARDocumentType,
@CurrDocumentNo OUTPUT,
@CurrDocumentNoCompany OUTPUT,
@TRANSACTIONID,
@TIMELASTMOD,
@USERIDLASTMOD
END
Ответ №1:
Вы не можете присвоить скалярным переменным несколько значений. Если вы ограничены в том, что у вас нет доступа для изменения dbo.CreateManCreditHDFromReturn
, вам придется использовать курсор или цикл и перебирать каждую запись в вашем запросе. Хранимая процедура закодирована так, чтобы принимать одно значение за раз для своих входных параметров.
Если у вас есть возможность изменять dbo.CreateManCreditHDFromReturn
, вы можете обновить его, чтобы принять табличную переменную, JSON или XML, а затем внутри этой хранимой процедуры вы можете распаковать входные данные и обработать их соответствующим образом.
Если вам нужно использовать курсор, что, я предполагаю, будет иметь место, это будет выглядеть примерно так:
DECLARE @CompanyCode NVARCHAR(10);
[...and other variables...]
DECLARE RANOCURS CURSOR FOR
SELECT CompanyCode, [...and other fields...]
FROM ReturnDetail rd
INNER JOIN ReturnHeader rh ON rh.RETURNNO = rd.RETURNNO
WHERE rh.RETURNDATE >= '2020-03-27 00:00:00'
AND rh.RETURNDATE< '2020-03-28 00:00:00'
AND rd.RANO IN (79383, 79820)
AND rd.ARDOCUMENTNOCOMPANY = 0;
OPEN RANOCURS;
FETCH NEXT FROM RANOCURS INTO @CompanyCode, [...other variables...]
DECLARE @CurrDocumentNo INT, @CurrDocumentNoCompany INT;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.CreateManCreditHDFromReturn
@CompanyCode ,
[...other variable parameters...],
@CurrDocumentNo OUTPUT,
@CurrDocumentNoCompany OUTPUT;
[...do something with the return values...]
FETCH NEXT FROM RANOCURS INTO @CompanyCode, ...[other fields]
END;
CLOSE RANOCURS;
DEALLOCATE RANOCURS;