2013-11-15 6 views
0

Я создаю общий параметризованный запрос (INSERT или UPDATE), и я использую параметры для вставленных столбцов (в запросе INSERT) и параметры для обновленных столбцов и столбцов where where (в запросе UPDATE).Возможно ли иметь несколько ключевых слов OUTPUT в SQL-параметризованном запросе?

В любом случае, я также разрешаю указать имя столбца, которое возвращается моим методом, и для этого я использую OUTPUT INSERTED.ColumnName. Этот столбец может быть основным ключом таблицы, но это может быть и другое.

Теперь, после выполнения INSERT или UPDATE, я хочу получить ключ строки, которая была только что вставлена ​​или обновлена. Как я могу это сделать? Могу ли я сделать что-то вроде OUTPUT INSERTED.ColumnName, SCOPE_IDENTITY()?

Примечание: Это НЕ хранимая процедура, если это имеет значение.

+2

вы можете показать нам некоторый код ?? aaaaaand btw, вы видели структуру сущности? – Misters

+0

'SCOPE_IDENTITY()' возвращает одно значение, представляющее последнее значение идентификации, вставленное в текущую область. Я не уверен, что это имеет смысл в предложении «OUTPUT», которое может обрабатывать несколько строк и где базовая таблица может даже не иметь столбец IDENTITY. – HABO

+0

У вас не может быть несколько ключевых слов 'OUTPUT', но вы можете вывести несколько столбцов **, например' OUTPUT Inserted.ColumnName, Inserted.ID' и т. Д. –

ответ

1

Уверенный, вы можете. Это выглядело бы как-нибудь так:

DECLARE @result TABLE (
    ID INT, 
    SomeColumn NVARCHAR(100) 
) 

INSERT SomeTable (SomeColumn) 
OUTPUT SCOPE_IDENTITY(), INSERTED.SomeColumn 
INTO @result 
VALUES ('Foo'), 
     ('Bar') 

SELECT * FROM @result 

Это выведет:

ID | SomeColumn 
--------------- 
1 | 'Foo' 
2 | 'Bar' 
+0

Ваш синтаксис выглядит по-другому, это хранимая процедура? Я использую параметризованный запрос в C# и в настоящее время использую 'command.ExecuteScalar()'. Будет ли это работать для вывода 2 значений? Или мне придется использовать 'ExecuteReader()'? – user2320724

+0

@ user2320724 Это не хранимая процедура, но вы не сможете использовать 'ExecuteScalar', потому что это только когда-либо вернет одно значение. Вам нужно будет использовать 'ExecuteReader'. –

+0

Если на столе нет триггеров, вы можете пропустить табличную переменную, а затем выбрать предложения. просто сделайте 'INSERT ... OUTPUT вставленный.Id, вставленный.SomeColumn VALUES ...' – adrianm