0

我有桌子

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
)
4

1 回答 1

0

您可以使用下面的过程(将 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
于 2013-05-14T15:28:36.633 回答