1

我在 C# 应用程序的 sql server 数据库中有这两个表。

----------------------------
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)或三个字段中都有值,而不是在 table_Item_Shelves 中为 Item_ID 字段中的每个项目插入“1”。对于下一行进行相同的检查并从 Item_ID 字段中获取最大值并增加 1。我还需要检查最多四个 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 不为空且 Item2 不为空且 item3 不为空)或(Item1 不为空且 Item2 不为空且 item4 不为空)或(Item1 不为空且 Item3 不为空且 item4 为不为空)或(第 2 项不为空且第 3 项不为空且第 4 项不为空)

        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 并且第 4 行 < 5 并且第 5 行 <5 列的值 AND 第 3 行 + 第 4 行 + 第 5 行也是 < 5,所以我忽略它们。如果“Item_ID”不是“NULL 或 Empty”,我也会忽略该列。

最终结果将如下所示。

    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

有点难以理解您想要的最终结果(没有预期结果示例),但是您的程序的第一部分 WHERE 子句可以大大简化以更轻松地处理更多字段......

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

通过使用这样的替代格式(允许查询独立运行的额外数据)

这种格式允许您只复制 CASE 语句并更改有效字段计数的标准。

WITH A AS (
    SELECT 'A' AS Item1, 'B' AS Item2, 'C' AS Item3, 'D' AS Item4
    UNION ALL SELECT 'E', 'F', 'G', NULL
    UNION ALL SELECT 'H', 'I', NULL, NULL
    UNION ALL SELECT 'J', NULL, NULL, NULL
), B AS (
    SELECT A.*
        , ROW_NUMBER() OVER ( ORDER BY Item1 ) AS RowIndex
        , 0 AS processed
        , CASE WHEN Item1 IS NULL THEN 0 ELSE 1 END 
            + CASE WHEN Item2 IS NULL THEN 0 ELSE 1 END
            + CASE WHEN Item3 IS NULL THEN 0 ELSE 1 END
            + CASE WHEN Item4 IS NULL THEN 0 ELSE 1 END
            AS ValidFieldCount
    FROM A
)
SELECT * 
FROM B
WHERE ValidFieldCount >=3
于 2013-10-09T15:11:59.183 回答
0

这可能会奏效。

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 回答