好的,我的桌子
cl_CategoryId
int主键自动增量
好了,我想要实现的目标相当复杂
假设我有以下产品类别
Home
> Computer Hardware
1:检查Home
类别是否存在。如果不存在,请将其插入到cl_ParentCategoryId
= 0
2:检查Computer Hardware
是否存在。
2.1:如果存在,但cl_ParentCategoryId
= 0更新其cl_ParentCategoryId
值= Home
已插入或已选择的cl_CategoryId
值并返回现有cl_CategoryId
{1}}
2.2:如果不存在,请将其插入数据库,并在Computer Hardware
= cl_ParentCategoryId
处插入或选择Home
值,并返回分配给cl_CategoryId
的新cl_CategoryId
所以结果会像
Computer Hardware
我可以使用SQL Server 2014查询实现此目的吗?
我们可以对更多类别进行一些递归吗?
示例1 : Home : 0
2 : Computer Hardware : 1
> Home
> Computer Hardware
> Graphic Cards
非常感谢您的回答
SQL server 2014
答案 0 :(得分:1)
它假设您有一个c#侧的相关对列表。
它使用表类型来表示SQL端的对列表。然后,它会根据您传入的对创建一个存储过程来更新类别。此机制称为Table Valued Parameter
-- defines a parent relationship
create type parentRel as Table (
category nvarchar(200) not null,
parent_category nvarchar(200)
);
go
Create Proc UpdateCategories @rels as parentRel readonly as
-- 1. Insert new items, generating ids
insert into Category (cl_categoryName, cl_ParentCategoryId)
select
category,
0
from
@rels r
where
not exists (
select 'x'
from Category c
where r.category = c.cl_CategoryName
);
-- 2. Update parent structure
update
c
set
c.cl_ParentCategoryId = isnull(c2.cl_CategoryId, 0)
from
Category c
inner join
@rels r
on c.cl_CategoryName = r.category
left join
Category c2
on r.parent_category = c2.cl_CategoryName;
Go
注意,您要么想要将事务添加到存储过程,要么从事务中调用它。此外,此机制假定类别名称是唯一的。