C#アプリケーション用のSQLサーバーデータベースにこれら2つのテーブルがありました。
----------------------------
table_Items
----------------------------
Item1 | Item2| Item3 | Item4
A | B | C | D
E | F | G | Null
H | I | Null | Null
J | Null | Null | Null
------------------
table_Item_Shelves
------------------
Item_Name | Item_ID
A | Null
B | Null
C | Null
D | Null
E | Null
これが私がしなければならなかったことです。table_items の各行について、行がすべて (項目 1、2、3、4) または 3 つのフィールドに値を持っているかどうかを最初に確認します。次の行についても同じチェックを行い、Item_ID フィールドから最大値を取得し、1 ずつ増やします。最大 4 つの Item_ID が同じであることも確認する必要があります。C# と SQL のヘルプは素晴らしいものです。ありがとう。
table_Item_Shelves 列 Item_ID に既に値が含まれている場合、新しい ID を挿入しないでください table_Item_Shelves には既にレコードが含まれており、それらのレコードに対して更新する必要があります。
CREATE PROCEDURE UpdateItemIDs AS BEGIN SELECT ROW_NUMBER() OVER (ORDER BY Item1) AS RowIndex , IT.* , 0 AS 処理 INTO #TempTable FROM dbo.table_items IT WHERE ( Item1 IS NOT NULL AND Item2 IS NOT NULL AND item3 IS NOT NULL ) OR ( Item1 IS NOT NULL AND Item2 IS NOT NULL AND item4 IS NOT NULL ) OR ( Item1 IS NOT NULL AND Item3 IS NOT NULL AND item4 IS NOT NULL ) OR ( Item2 IS NOT NULL AND Item3 IS NOT NULL AND item4 IS NOT NULL )
DECLARE @ITEM1 VARCHAR(50)
DECLARE @ITEM2 VARCHAR(50)
DECLARE @ITEM3 VARCHAR(50)
DECLARE @ITEM4 VARCHAR(50)
DECLARE @RowIndex INT
DECLARE @NewItemID INT
WHILE ( SELECT COUNT(*)
FROM #TempTable
WHERE processed = 0
) > 0
BEGIN
SELECT TOP 1
@ITEM1 = Item1 ,
@ITEM2 = Item2 ,
@ITEM3 = item3 ,
@ITEM4 = Item4 ,
@RowIndex = RowIndex
FROM #TempTable
WHERE processed = 0
UPDATE #TempTable
SET processed = 1
WHERE RowIndex = @RowIndex
SET @NewItemID = ( SELECT ISNULL(MAX(Item_ID), 0) + 1
FROM dbo.table_items_shelves
) ;
UPDATE dbo.table_items_shelves
SET Item_ID = @NewItemID
WHERE Item_Name IN ( @ITEM1, @ITEM2, @ITEM3, @ITEM4 )
AND Item_ID IS NULL
END
END
上記のストアド プロシージャは (誰かの助けを借りて) 動作しますが、table_items(Item1,Item2.....Item8) の 8 列で動作するように変更し、すべての行に値があるかどうかを確認する必要があります( item1、item2....item8) または 5 つのフィールド、table_Item_Shelves より Item_ID フィールドの各アイテムに「1」を挿入します。table_items(Item1,Item2.....Item8) の 8 列の場合
able_Items
-----------------------------------------------------------------------
Item1 | Item2 | Item3 | Item4 | Item5 | Item6 | Item7 | Item8 |
------------------------------------------------------------------------
Pencils | Rubbers | Books | DvDs | Glue |Stapler| CDs |Mouse |
Marker |KeyChain |Clipboards |Pens |Bucket| Null |
Monitors| Null |
Glue | Null |Null | Null | Null | Null | Null | Null | Null |
Papers| Null | Null | Null
table_Item_Shelves
------------------
Item_Name | Item_ID
-------------------
Pencils | Null
Rubbers | Null
Pens | Null
Books | Null
Staplers | Null
Glue | Null
Buckets | Null
Keyborads | Null
Monitors | Null
Mouse | Null
CDs | Null
DvDs | Null
Papers | Null
Clipboards| Null
Markers | Null
KeyChains | Null
提供されたテーブルのデータから、次のような結果が期待されます
table_Items は行 1 のすべての列に値を持ち、
テーブルに Item_ID がないため、行 1 の各項目に対して '1' を挿入します。行 2 を確認すると、5 つの項目があるため、項目ごとに Max(Item_ID) + 1 を挿入します。
行 3<5 AND 行 4 < 5 AND 行 5<5 列と値 AND ROW 3+ ROW 4 + ROW 5 も < 5 であるため、無視します。また、「Item_ID」が「NULLまたは空」でない場合、列を無視します。
最終結果は次のようになります。
table_Item_Shelves
------------------
Item_Name | Item_ID
-------------------
Pencils | 1
Rubbers | 1
Pens | 2
Books | 1
Staplers | 1
Glue | 1
Buckets | 2
Keyborads | Null
Monitors | Null
Mouse | 1
CDs | 1
DvDs | 1
Papers | Null
Clipboards| 2
Markers | 2
KeyChains | 2
デザインの提案はありません、私はそれが恐ろしいことを知っています. ありがとう。