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

このテーブルは、行を更新または挿入する必要があるすべての可能性を表しています。上記の表に 1 行も存在しない場合は、新しい行を挿入します。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 に答える