簡単に言うと、私の質問は、カーソル(擬似コード)を使用せずに、t-sql2012で次のことを行う方法です。
for each r in input_list:
insert into t1(...) ...
if (r.field1 is not null)
insert into tA(...) (...@@identity ... r.field1) ...
else if (r.field2 is not null)
insert into tB(...) (...@@identity... r.field2) ...
長い質問:
次の3つのテーブルがあり、オブジェクトがファイルまたはディレクトリのいずれかであるという事実をモデル化するとします。
obj(id int, creation_date datetime) -- all objects have a creation date.
file(id int, id_obj int, path nvarchar(max)) -- id_obj is a foreign key to obj
dir(id int, id_obj int, path nvarchar(max), shared bit) -- id_obj is a foreign key to obj
「論理オブジェクト」(ファイルまたはdirのいずれかを表すことができます)のリストを取得してDBに追加するストアドプロシージャを作成する必要があります。つまり、論理オブジェクトごとに1)objに行を作成する必要があります。 2)ファイルまたはディレクトリのいずれかの行(論理オブジェクトがファイルを表すかディレクトリを表すかによって異なります)。
このストアドプロシージャを作成するために、論理オブジェクトを表すテーブルパラメータを作成しました。これは、ファイルとdirの両方を表すことができる必要があるため、次のように、fileとdirの(論理)フィールドのマージが含まれている必要があります。
create type logicalObj as table(
dirPath nvarchar(max) null,
dirShared bit null,
filePath nvarchar(max) null
)
私のストアドプロシージャは、次のようにテーブル値パラメーターで定義されています。
create procedure foo
-- this way the user can pass a list of logical objects to the stored proc
@lo logicalObj readonly .
as
begin
...
end
プロシージャ本体で、(擬似コード)のようなことをする必要があると思います。
for each lo in @lo:
insert into obj(creation_date)
values (curdate())
if lo.dirPath is not null
insert into dir(id_obj, path, shared)
values (@@identity, lo.dirPath, 1 )
else if lo.filePath is not null
insert into file(id_obj, path)
values (@@identity, lo.dirPath )
私の質問:カーソルなしでこれを行う方法は?必要に応じて、t-sql 2012に固有の機能(シーケンスなど)を使用してもかまいません。