Получение идентификатора в переменной временной таблицы по временной таблице INSERT INTO ... OUTPUT ... INTO - PullRequest
0 голосов
/ 13 декабря 2018

Это пример процедуры, которую я использую.

create procedure PRO_ProcName
    @description varchar(max), 
    @txn_no varchar
as
begin
    declare @txn table (
        id bigint,
        description varchar(max),
        txn_no varchar
    );

    declare @txn_id bigint;

    insert into transactions    
    (
        description,
        txn_no
    )
    output
        inserted.description,
        inserted.txn_no
    into @txn
    values
    (
        @description,
        @txn_no
    )

    select @txn_id = id from @txn;
end

Я получаю сообщение об ошибке типа:

Column name or number of supplied values does not match table definition.

Я знаю, что это потому, что яВ моей временной таблице есть поле id, и оно не вставляется в оператор insert into.Я не могу дать значение для id, потому что это первичный ключ с автоинкрементом.

Как я могу решить эту ситуацию и получить id вставленной записи в переменную?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Таблица inserted представляет данные, которые существуют в целевой таблице после вставки - поэтому она также включает автоматически сгенерированные значения, независимо от того, были ли они сгенерированы определением значения по умолчанию или определением идентичности в столбцах - таквам нужно добавить inserted.id к предложению output.

Однако в вашей процедуре есть еще две ошибки.
Первое и самое важное - это то, что вы не указалидлина до параметра @txn_no varchar.В этом случае SQL Server будет неявно указывать длину 1 символ.
Вторым является тот факт, что вы не указываете список столбцов @txn в предложении output.

Вотулучшенная версия вашего кода со всеми этими проблемами:

create procedure PRO_ProcName
    @description varchar(max), 
    @txn_no varchar(255) -- Note: I don't know the actual length you need
as
begin
    declare @txn table (
        id bigint,
        description varchar(max),
        txn_no varchar
    );

    declare @txn_id bigint;

    insert into transactions    
    (
        description,
        txn_no
    )
    output
        inserted.id,
        inserted.description,
        inserted.txn_no
    into @txn(id, description, txn_no)
    values
    (
        @description,
        @txn_no
    )

    select @txn_id = id from @txn;
end
0 голосов
/ 13 декабря 2018

Я не могу дать значение для id, потому что это первичный ключ с автоинкрементом.

Нет, это не так.Вы не объявили, что это что-то в этом роде.Поэтому нам нужно сначала исправить это:

declare @txn table (
    id bigint IDENTITY PRIMARY KEY,
    description varchar(max),
    txn_no varchar
);

А затем мы исправим это, указав список столбцов в вашем предложении INTO:

output
    inserted.description,
    inserted.txn_no
into @txn (description, txn_no)

Это всегда хорошая привычка указыватьВ любом случае, список столбцов.

Или, если я неверно истолковал ваш вопрос, и идентификатор должен быть из transactions, тогда вы просто добавляете inserted.id в качестве другого столбца в своем предложении OUTPUT.inserted представляет это состояние таблицы после вставки.Таким образом, вы можете включить столбцы из него в ваше предложение OUTPUT, даже если вы не указали их в INSERT.

...