SQL server如何插入/更新/选择多个父>同一查询中的节点类别

时间:2014-08-24 23:23:55

标签: sql sql-server tsql sql-server-2014

好的,我的桌子

enter image description here

cl_CategoryId int主键自动增量

好了,我想要实现的目标相当复杂

假设我有以下产品类别

Home> Computer Hardware

1:检查Home类别是否存在。如果不存在,请将其插入到cl_ParentCategoryId = 0

的DB中

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

1 个答案:

答案 0 :(得分:1)

我在SQL Fiddle

上写了一个例子

它假设您有一个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

注意,您要么想要将事务添加到存储过程,要么从事务中调用它。此外,此机制假定类别名称是唯一的。