【问题标题】:How to create stored procedure for update/insert all combinations in SQL如何创建存储过程以更新/插入 SQL 中的所有组合
【发布时间】:2013-05-14 08:17:22
【问题描述】:

我有这样的桌子

Col1, Col2, Col3, Col4
----  ----  ----
1      0     1     sd
1      0     2     asdas
1      1     1     sd
1      1     2     ads  
2      0     1     sad
2      0     2     ds
2      1     1     sad
2      1     2     sad

此表代表我拥有的所有可能性。我需要更新或插入行。如果上表中的一行不存在,我将插入新行。 如果我为 Col1 或 Col2 或 Col3 发送 -1,我需要更新/插入该列的所有变体。

Col1 接受 1 和 2。

Col2 接受 0 和 1。

Col3 接受 1 和 2。

例如:

Col1 = -1, Col2 = 1, Col3 =  -1, Col4 = test

我需要更新/插入下一列

Col1, Col2, Col3, Col4
----  ----  ----    
1      1     1     test
1      1     2     test      
2      1     1     test
2      1     2     test

你能帮我处理存储过程吗?

CREATE PROCEDURE [dbo].[MyStoredProcedure]
(
   @Col1 int,    
   @Col2 int,
   @Col3 int,  
   @Col4 uniqueidentifier
)

【问题讨论】:

  • 请问什么平台和版本?另外,当您发送 -1 时,如何选择这些值?在现有值上(它们是否完整?)或来自其他表(这会更有意义)
  • 您说“我需要更新/插入下一列”,但示例数据已包含在第一组数据中。这个问题我们无法回答
  • 第一个表代表所有可能性。首先你创建表并且表是空的,你调用 sp 和 sp 例如插入 1 行。然后你再次调用 sp,现在你更新 1 行并插入 3 行。然后你删除一行。再次调用 sp 并执行更新/插入。
  • 我不知道您在发布问题之前付出了多少努力,但我认为您的问题非常清楚。

标签: sql sql-server stored-procedures


【解决方案1】:

您可以使用下面的 proc(将 column4 更改为您喜欢的任何数据类型)。我使用了 MERGE,这里可能没问题...其他人可能更喜欢将值存储在临时表中,然后执行 UPDATE 然后执行 INSERT(因为 MERGE 有一些已知问题...不过我仍然喜欢它;))。

CREATE PROCEDURE [dbo].[MyStoredProcedure]
(
   @col1 INT,    
   @col2 INT,
   @col3 INT,  
   @col4 VARCHAR(MAX)
)
AS
-- 3 tables to contain possible values for columns 1,2,3 (these should really be in separate lookup tables)
;WITH C1Values AS (
    SELECT 1 AS v
        UNION ALL SELECT 2
)
, C2Values AS (
    SELECT 0 AS v
    UNION ALL SELECT 1
)
, C3Values AS (
    SELECT 1 AS v
    UNION ALL SELECT 2
) 
MERGE MyTable
USING (
    -- build all permutations that match input parameters
    SELECT  c1.v, c2.v, c3.v
    FROM    C1Values c1
            CROSS JOIN C2Values c2
            CROSS JOIN C3Values c3
    WHERE   c1.v = CASE WHEN @col1 = -1 THEN c1.v ELSE @col1 END
            AND c2.v = CASE WHEN @col2 = -1 THEN c2.v ELSE @col2 END
            AND c3.v = CASE WHEN @col3 = -1 THEN c3.v ELSE @col3 END
) AS src (c1, c2, c3)
ON MyTable.Col1 = c1 AND MyTable.Col2 = c2 AND MyTable.Col3 = c3
WHEN NOT MATCHED THEN
    INSERT (Col1, Col2, Col3, Col4)
    VALUES (src.c1, src.c2, src.c3, @col4)
WHEN MATCHED THEN
    UPDATE
    SET     MyTable.Col4 = @col4;
GO

【讨论】:

    猜你喜欢
    • 2022-07-30
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2010-09-06
    相关资源
    最近更新 更多