简而言之,我的问题是如何在没有游标(伪代码)的 t-sql 2012 中执行以下操作:
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
我需要编写一个存储过程,它采用“逻辑对象”列表(可以表示文件或目录)并且必须将它们添加到数据库中,即它必须为每个逻辑对象创建 1)obj 中的一行, 2)文件或目录中的一行(取决于逻辑对象是代表文件还是目录)。
为了编写这个存储过程,我创建了一个表示逻辑对象的表参数。这必须能够表示文件和目录,因此它必须包含文件和目录的(逻辑)字段的合并,如下所示:
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 独有的功能(例如序列)。