Как я могу использовать параметр с табличным значением, чтобы вставить несколько строк и затем вернуть их идентификаторы? - PullRequest
3 голосов
/ 05 ноября 2011

В моем приложении у меня есть большое количество (более 100) строк, которые мне нужно вставить в базу данных.После того, как они вставлены в базу данных, мне нужно вставить их дочерние элементы, которые имеют ссылку на внешний ключ, для дочерних элементов.

Мне интересно, есть ли способ написать хранимую процедуру, которая может вставить всеэти строки и вернуть их идентификаторы обратно в мое приложение?

Ответы [ 4 ]

3 голосов
/ 05 ноября 2011

Вот пример использования предложения output, как предложил Oded.Сначала немного кода установки:

if exists (select * from tempdb.sys.tables where name like '#tmp%')
    drop table #tmp
create table #tmp (id int identity, FirstName varchar(50), LastName varchar(50))

if exists (select * from sys.procedures where name = 'TestProcedure')
    drop procedure TestProcedure
if exists (select * from sys.types where name = 'TestTableType')
    drop type TestTableType

create type TestTableType as table (FirstName varchar(50), LastName varchar(50))
go

Теперь мы можем создать хранимую процедуру:

create procedure dbo.TestProcedure
    @List TestTableType readonly
as
insert  #tmp
        (FirstName, LastName)
output  inserted.*
select  FirstName
,       LastName
from    @List l
go

Обратите внимание на предложение output, которое сообщает SQL Server, что нужно возвращать вставленные строкиклиент, в том числе значение идентификатора столбца.Теперь, когда весь код настроен, мы можем проверить его:

declare @List TestTableType
insert @List values ('Rick','Cain'),
    ('Herman', 'Gingrich'),
    ('Newt', 'Paul'),
    ('Ron', 'Perry')

exec  dbo.TestProcedure @List

select * from #tmp

Вы увидите, что значения, возвращаемые процедурой, точно соответствуют значениям в #tmp.

3 голосов
/ 05 ноября 2011

Вы пометили свой вопрос параметрами таблицы-значения - вы можете передать их в хранимую процедуру для вставки в базу данных.

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

0 голосов
/ 29 июня 2012

Я все еще изучаю, как это сделать, но мне кажется, что если вы хотите вставить родительскую таблицу и дочернюю таблицу, это можно сделать одним вызовом sql, передав обе таблицы в качестве параметров табличных значений. Если у вас есть некая искусственная идентификация (связь), которая в настоящее время связывает две таблицы, например, номер строки, но не обязательно хранится ни в одной из таблиц БД, тогда, когда родительский элемент вставляется и получает значение идентификатора, он может быть присоединен к дочерней таблице. используя уникальные отношения и внешние ключи ребенка могут быть обновлены. Ребенок может быть вставлен.

Вывод интересен, но на самом деле мне не нужен вывод, его просто нужно использовать внутри sproc, поэтому мне нужно провести дополнительное исследование, чтобы увидеть, может ли вывод использоваться, например, при его выводе. во временную таблицу.

Отвечая на мой вопрос, синтаксис для вывода:

[ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]

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

0 голосов
/ 07 ноября 2011

Я бы сделал что-то похожее на то, что предлагает Andomar, но используя описанную здесь технику «INSERT-EXEC»:

http://www.sommarskog.se/tableparam.html

В ссылке найдите: INSERT-EXEC

...