1

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

デザインの提案はありません、私はそれが恐ろしいことを知っています. ありがとう。

4

2 に答える 2

0

This might work.

using System;

    using System.Collections.Generic;

    using System.Data;

    using System.Data.SqlClient;

    using System.Linq;

    using System.Text;


    namespace InsertTeamIdIntoTable

    {

        class Program

        {

            const string str = @"Data Source=(localdb)\Projects;Initial Catalog=TestDb;Integrated Security=SSPI";

            static void Main(string[] args)

            {


                InsertItemData(str);

            }


            private static void InsertItemData(string connectionString)

            {

                string queryString =

                    "SELECT item1,item2,item3,item4 FROM dbo.table_items;";


                using (SqlConnection connection =

                           new SqlConnection(connectionString))

                {

                    SqlCommand command =

                        new SqlCommand(queryString, connection);

                    connection.Open();


                    SqlDataReader reader = command.ExecuteReader();

                    int itemId = 1;

                    //check if row has values in all(item 1,2,3,4) or three of the fields,

                    while (reader.Read())

                    {

                        bool flag = CheckValueNumber((IDataRecord)reader);

                        if (flag)

                        {


                            for (int i = 0; i < ((IDataRecord)reader).FieldCount; i++)

                            {

                                string itemName = ((IDataRecord)reader)[i].ToString();

                                if (string.IsNullOrWhiteSpace(itemName) == false)

                                {

                                    if (CheckItemShelveExists(str, itemName))

                                    {

                                        if (CheckItemIdExists(str, itemName) == false)

                                        {

                                            UpdateTableItemShelves(str, itemId, itemName);

                                        }

                                    }

                                    else

                                    {

                                        InsertTableItemShelves(str, itemId, itemName);

                                    }

                                }

                            }

                            itemId++;

                        }

                    }

                    reader.Close();

                }

            }


            public static void UpdateTableItemShelves(string connectionString, int itemId, string itemName)

            {

                string updateString = string.Format("Update dbo.table_item_shelves set item_id ={0} WHERE item_name ='{1}';", itemId, itemName);


                using (SqlConnection connection =

                           new SqlConnection(connectionString))

                {

                    SqlCommand command =

                        new SqlCommand(updateString, connection);

                    connection.Open();


                    command.ExecuteNonQuery();


                }

            }


            public static void InsertTableItemShelves(string connectionString, int itemId, string itemName)

            {

                string updateString = string.Format("Insert Into dbo.table_item_shelves(item_id,item_name) VALUES({0},'{1}');", itemId, itemName);


                using (SqlConnection connection =

                           new SqlConnection(connectionString))

                {

                    SqlCommand command =

                        new SqlCommand(updateString, connection);

                    connection.Open();


                    command.ExecuteNonQuery();


                }

            }



            public static bool CheckItemShelveExists(string connectionString, string itemName)

            {

                string updateString = string.Format("Select count(id) From dbo.table_item_shelves WHERE item_name ='{0}';", itemName);


                using (SqlConnection connection =

                           new SqlConnection(connectionString))

                {

                    SqlCommand command =

                        new SqlCommand(updateString, connection);

                    connection.Open();


                    return (Int32)command.ExecuteScalar() > 0;


                }

            }


            public static bool CheckItemIdExists(string connectionString, string itemName)

            {

                string updateString = string.Format("Select item_id From dbo.table_item_shelves WHERE item_name ='{0}';", itemName);


                using (SqlConnection connection =

                           new SqlConnection(connectionString))

                {

                    SqlCommand command =

                        new SqlCommand(updateString, connection);

                    connection.Open();

                    SqlDataReader reader = command.ExecuteReader();


                    while (reader.Read())

                    {

                        if (string.IsNullOrWhiteSpace(((IDataRecord)reader)[0].ToString()) == false)

                        {

                            return true;

                        }

                    }


                    reader.Close();

                    return false;


                }

            }


            public static bool CheckValueNumber(IDataRecord record)

            {

                int count = 0;

                for (int i = 0; i < record.FieldCount; i++)

                {

                    if (string.IsNullOrWhiteSpace(record[i].ToString()) == false)

                    {

                        count++;

                    }

                }

                return count >= 3;

            }


        }

    }
于 2013-10-22T21:17:40.380 に答える