Сейчас у меня внутри хранимой процедуры есть такой запрос:

INSERT INTO YTDTRNI (TRCDE, PROD, WH, DESCR, UCOST, TCOST, DRAC, CRAC, REM, QTY, UM, ORDNO, TRDATE, SYSDATE, PERIOD, USERID)
    SELECT 
        'AJ', PROD, WH, DESCR, 0, -TCOST, STKGL, COSGL,
        'MASS ADJUSTMENT', 0, UM, 
        CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS nvarchar(255)), 
        GETDATE(), GETDATE(), @inputPeriod, @inputUserId
    FROM 
        INV
    WHERE 
        H = 0

Я использую row_number(), чтобы получить число, которое увеличивается при выполнении запроса.

Например, запрос выше INSERT 2018 записи в таблице YTDTRNI. Таким образом, последнее число, сгенерированное этой функцией row_number(), - 2018. Теперь у меня вопрос, можно ли получить это последнее число, сгенерированное row_number().

Например, в другой таблице у меня хранится значение I1000. Итак, после выполнения вышеуказанной операции. Мне нужно обновить эту таблицу новым значением I3018 (1000 + 2018).

Я застрял в том, как двигаться дальше. Открыт для любых советов, если все, что я делаю, неправильно или не соблюдаю соглашения / стандарты.

0
JC6T 26 Сен 2018 в 06:00

2 ответа

Лучший ответ

Просто сделайте @@rowcount после вашего запроса

DECLARE @rc INT

INSERT INTO YTDTRNI ( ... )

SELECT @rc = @@rowcount

После этого вы можете использовать этот @rc для обновления другой таблицы

2
Squirrel 26 Сен 2018 в 03:27

@@ROWCOUNT не является надежным, если в базе данных есть триггеры. Я настоятельно рекомендую вам не использовать его.

Вместо этого используйте OUTPUT:

declare @t table (rn int);

insert into . . .
    output (inserted.ordno) into @t
    select . . .;

Тогда вы можете просто сделать:

select max(ordno) from @t;

Это точно фиксирует то, что вводится в таблицу.

0
Gordon Linoff 26 Сен 2018 в 11:43