【问题标题】:Stored procedure in SQL Server 2012SQL Server 2012 中的存储过程
【发布时间】:2016-02-19 08:46:15
【问题描述】:

我需要你的帮助来编写一个存储过程来将下面给出的数据更新到 SQL Server 中的一个表中。

我已上传图片以确保格式设置正确。

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

为了让我们在顶层装配的物料清单计划中进行区分,我们需要用所用组件的最后一个字符更新装配哈希键(字符串)(例如:103,使用3),@987654332 @ 变为 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

【问题讨论】:

  • hashkeystring 数据类型吗?
  • 部件 100 具有组件 101-109,部件 110 具有组件 111-119?
  • 看起来预期的结果不符合这个条件:用所用组件的最后一个字符更新程序集哈希键(例如:102,使用 2),000111 变为 200111
  • 如果预期的结果是好的,你需要:cast(ROW_NUMBER() OVER(PARTITION BY t.[PART] ORDER BY t.[ID]) as varchar(10)) 并用获得的关于它的长度的值替换hashkey 的前 N ​​个字符
  • 你怎么知道 ID1 应该更新为 1 而不是 2?

标签: sql sql-server stored-procedures procedure


【解决方案1】:

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

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

【讨论】:

  • 完美运行。谢谢你。我能够使用实际零件号对 SQL 进行必要的修改,并结合其他字段来组成 hashkey 并进行分配。使用行号将组件分配给 Parent 很聪明。我没有想到。再次感谢您。
【解决方案2】:

试试这个。

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

【讨论】:

  • 我运行了代码,但预期的结果与我的预期不同。我更新了图像以突出显示不同之处。组件的最后一个字符(不管是 103 还是 104 * 更改了数字以使其清楚)应该在父程序集哈希之一中更新。在您的代码中,父 id 用于更新哈希而不是组件。在其他帖子中添加了一些 cmets 使其更加清晰。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多