SQL Server Scope_Identity () Проблема использования - PullRequest
0 голосов
/ 20 июня 2011

Я не могу понять, почему эта многостоловая вставка (хранимая процедура) с помощью scope_identity () не работает.Вот в чем суть (простите, пожалуйста, здесь невообразимое наименование):

enter image description here

Столбец RowID в TableB - это, очевидно, int, не заданный как автоприращение идентификатора или что-то подобное,

Если я запускаю его в Management Studio, он говорит, что была затронута 1 строка, но не выполняет вставки.

Если я запускаю его из кода, я получаю сообщение об ошибке, что я могу 'Вставьте значение NULL в TableB, RowID, что правильно, оно имеет ненулевое ограничение.Но он должен получать scope_identity () из первой таблицы.

Я пробовал входить и выходить из транзакций и с различными инициализацией параметров ... Это убивает меня.Заранее благодарим за любую помощь.

Ответы [ 3 ]

1 голос
/ 21 июня 2011

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

Попробуйте это.

declare @TableA table (IDA int identity primary key, ColA int)
declare @TableB table (IDB int primary key, ColB int)

declare @RecordID int = 0,
        @Val1 int

if @RecordID = 0
  begin
    declare @NewID int

    insert into @TableA values (@Val1)
    set @NewID = scope_identity()

    insert into @TableB values (@NewID, @Val1)
  end
else
  begin
    print 'Do something else'
  end  

select *
from @TableA, @TableB

Результат:

IDA         ColA        IDB         ColB
----------- ----------- ----------- -----------
1           NULL        1           NULL

Возьмите его на себя.http://data.stackexchange.com/stackoverflow/q/103697/using-scope-identity

1 голос
/ 21 июня 2011

Еще одна вещь, на которую стоит обратить внимание, - есть ли у вас триггер (особенно триггер INSTEAD OF) в таблице, который может вызывать невозможность вставки записи.

Вы можете добавить оператор печати, чтобы увидеть значение переменной @newId после того, как вы его инициализировали, чтобы увидеть, является ли оно пустым или имеет значение.

Попробуйте использовать явные транзакции и блок try catch, и затем вы увидите, какую ошибку вы получаете в блоке catch, если она не прошла после первой вставки.

1 голос
/ 20 июня 2011

Я предполагаю, что для tableA в столбце чисел задано значение IDENTITY?

SCOPE_IDENTITY () будет НЕДЕЙСТВИТЕЛЕН, если нет

"1 затронутая строка" тоже не из этой ВСТАВКИ в таблицу A.

...