SCOPE_IDENTITY, @@ IDENTITY и IDENT_CURRENT возвращают ноль - PullRequest
1 голос
/ 16 апреля 2019

dbo, полные права доступа, локальная база данных SQL Server Express, таблицы, которые я создал и которыми владею.

Я только что вставил строку в MLA, и если я сделал SELECT * FROM MLA, я получил строку, которую я простовставлен ...

19 2019-04-16 15:02:52.000 Test

"19" - это ключ, который является столбцом идентификаторов.Поэтому я пытаюсь получить этот ключ с любым из этих ...

SELECT SCOPE_IDENTITY()
SELECT IDENT_CURRENT('MLA')
SELECT @@IDENTITY

И все они возвращают NULL.

Строка была вставлена ​​с этой строкой кода:

DbS.Execute(SQL)

где DbS - активное работающее соединение с сервером, который также использовался для вставки.Затем я пытаюсь получить ключ с помощью этого кода:

Dim DT as RecordSet
DT = DbS.Open("SELECT IDENT_CURRENT('USAA_ArgusVal_MLA')")

Я могу представить, что Open создает новую область действия, которая не объясняет @@IDENTITY

UPDATE : вот решение, которое было предложено ниже, я просто добавил SELECT к существующему оператору INSERT SQL и изменил .Execute на использование этого кода

SQL &= vbCrLf & "SELECT SCOPE_IDENTITY() AS MLAKey"
Dim DI As RecordSet = DbS.Open(SQL)
If DI.Read Then
    MLAKey = DI!MLAKey
Else
    MLAKey = ""
End If

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Вы можете использовать предложение OUPTUT и выполнить вставку + выбрать как одну операцию:

INSERT INTO MLA(...)
OUTPUT inserted.identity_column_name
VALUES(...)
1 голос
/ 16 апреля 2019

Возможно, ваше соединение "dbs" имеет некоторый пул соединений.

Напишите SQL INSERT и затем выберите SELECT тождество в том же операторе SQL.Лучшее решение - создать хранимую процедуру для вставки данных, а затем вернуть текущую идентификационную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...