Передача нескольких значений параметрам из существующей таблицы

#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;