SQL Server 2012 中的存储过程

Stored procedure in SQL Server 2012

我需要你的帮助来编写存储过程以将下面给出的数据更新到 SQL 服务器中的 table。

我上传了一张图片以确保格式设置正确。

标识零件号的第二列,例如:part 100 在材料清单中有 103104 作为其组成部分。但是只有 1(103 分配给 id 1part 100104 分配给 id 2part 100)。

为了我们在顶级组件的计划物料清单中进行区分,我们需要使用所用组件的最后一个字符更新组件散列键(字符串)(例如:103,使用 3), 000111 变为 300111。将哪个组件分配给父组件并不重要。

谁能帮我解决这个问题。谢谢。

Data Structure          Expected result

ID  Part  hashkey       ID  Part    hashkey
-----------------       --------------------
1   100   000111        1   100     300111
2   100   000111        2   100     400111
3   103   000111        3   103     000111
4   104   000111        4   104     000111

数据结构: expected_result

试试这个。

DECLARE @data TABLE (ID INT, Part INT, hashkey VARCHAR(100))

INSERT INTO @data
SELECT 1, 100, '000111'
UNION ALL
SELECT 2, 100, '000111'
UNION ALL
SELECT 3, 101, '000111'
UNION ALL
SELECT 4, 102, '000111';

WITH cte
AS (
    SELECT ID, Part, hashkey, ROW_number() OVER (
            PARTITION BY part ORDER BY part ASC
            ) AS RN
    FROM @data
    )
SELECT ID, Part, CASE 
        WHEN RN > 1
            THEN cast(ID AS VARCHAR) + hashkey
        WHEN lead(RN, 1) OVER (
                ORDER BY part, RN
                ) > 1
            THEN cast(ID AS VARCHAR) + hashkey
        ELSE hashkey
        END AS hashkey
FROM cte

好的,如果我现在理解你的要求,那么应该这样做:

WITH cteParent AS (
 SELECT Id, hashkey, 
   ROW_NUMBER() OVER (Partition By hashkey, Order by ID) AS rn
 FROM MyTable
 WHERE Part=100
)
, cteComponent AS (
 SELECT Id, hashkey, 
   ROW_NUMBER() OVER (Partition By hashkey, Order by ID) AS rn
 FROM MyTable
 WHERE Part<>100
)
SELECT t.Id, t.Part
, CASE
    WHEN t.Part=100 THEN RIGHT(CAST(c.Part AS varchar(31)),1) + SUBSTRING(CAST(p.hashkey AS varchar(31)), 2, LEN(CAST(t.hashkey AS varchar(31)))-1)
    ELSE CAST(t.hashkey AS varchar(31))
  END AS hashkey
FROM MyTable t
LEFT OUTER JOIN cteParent p ON t.Id=p.Id
LEFT OUTER JOIN cteComponent c 
 ON p.hashkey=c.hashkey
 AND p.rn=c.rn
ORDER BY ID asc