代码之家  ›  专栏  ›  技术社区  ›  Matt

字符串值的insert语句中的C#SQL循环

  •  0
  • Matt  · 技术社区  · 7 年前

    string SQLQuery = "INSERT INTO TABLEABC VALUES('" + Rtext + "', '" + TDate + "')";
    

    但我想为8周(56天)间隔的20次重复数据创建多行。

    例如:

    Rtext TDate
    John  23/11/2018
    

    我希望它能够创建:

    Rtext TDate
    John  23/11/2018
    John  18/01/2019
    John  15/03/2019
    John  10/05/2019
    John  05/07/2019
    John  30/08/2019
    John  25/10/2019
    John  20/12/2019
    John  14/02/2020
    John  10/04/2020
    John  05/06/2020
    John  31/07/2020
    John  25/09/2020
    John  20/11/2020
    John  15/01/2021
    John  12/03/2021
    John  07/05/2021
    John  02/07/2021
    John  27/08/2021
    John  22/10/2021
    John  17/12/2021
    
    4 回复  |  直到 7 年前
        1
  •  0
  •   Dumi    7 年前

    你可以试试这个。

    DECLARE @i INT=0, @LastDate AS DATE=GETDATE()
    
    WHILE (@i < 20)
    BEGIN
        INSERT INTO TABLEABC VALUES('" + Rtext + "', '" + @LastDate + "')
    
        SET @LastDate = @LastDate.AddDays(56)
        SET @i=@i+1;
    END
    
        2
  •  2
  •   Thom A    7 年前

    string SQLQuery = "INSERT INTO TABLEABC VALUES(@RText, @TDate)";
    SQLCommand Command = new SQLCommand(SQLQuery, YourConnection);
    Command.Parameters.Add("@RText",SQLDbType.varchar);
    Command.Parameters["@RText"].Value = RText; //Assumed variable name
    Command.Parameters.Add("@TDate",SQLDbType.date); //Assumed datatype
    Command.Parameters["@TDate"].Value = TDate; //Assumed variable name
    

    但这并不能解决重复项的问题,因此第一行可以替换为:

    string SQLQuery = "INSERT INTO TableABC SELECT @RText, DATEADD(WEEK, 8*I, @TDate) FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19)) V(I);";
    

    或者,您可以使用rCTE而不是虚拟理货表。在SQL中,这看起来像:

    WITH rCTE AS(
            SELECT @RText AS RText,
                   @TDate AS TDate
                   0 AS I
            UNION ALL
            SELECT RText,
                   DATEADD(WEEK, (I+1)*8,TDate) AS TDate,
                   I+1
            FROM rCTE
            WHERE I+1 <20
    )
    INSERT INTO TABLEABC
    SELECT RText,
           TDate
    FROM rCTE;
    

    WITH N AS(
            SELECT N
            FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
    Tally AS(
        SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
        FROM N N1 -10
             CROSS JOIN N N2 --100
             CROSS JOIN N N2 --1000
             CROSS JOIN N N2 --10000 --you get the idea
        )
    INSERT INTO TABLEABC
    SELECT TOP 500
           @RText,
           DATEADD(WEEK, (I-1)*8, @TDate)
    FROM Tally;
    

    从上面的意义上讲,rCTE是一种RBAR方法,因此需要的行越多,它的速度就会越慢。理货台会快得多,不是RBAR,也不需要 MAXRECURSION 选项

        3
  •  1
  •   Agustus Codes    7 年前

    您需要使用stringbuilder并在SQLQuery中追加插入字符串或concate。使用下面的代码。

    Datetime myDate = Convert.toDatetime("23/11/2018")
    string SQLQuery = "INSERT INTO TABLEABC VALUES('" + Rtext + "', '" + TDate + "');";
    SQLQuery += "INSERT INTO TABLEABC VALUES('" + John  + "', '" + myDate + "');";
    
    for (int i = 1; i <=19; i++)
    {
          SQLQuery +=" INSERT INTO TABLEABC VALUES('" + John  + "', myDate.AddDays(56) );";
    }
    
        4
  •  1
  •   Tetsuya Yamamoto    7 年前

    我更喜欢使用SQL参数和 for 循环为每次迭代执行insert命令,但应在下一次执行开始之前清除参数。下面是一个示例,假设您正在将日期字符串转换为 DateTime

    string SQLQuery = "INSERT INTO TABLEABC (RText, TDate) VALUES (@RText, @TDate)";
    
    // edit: TDate is a string, convert it to DateTime first
    DateTime date;
    
    if (DateTime.TryParseExact(TDate, "dd/MM/yyyy", CultureInfo.InvariantCulture, 
        DateTimeStyles.None, out date)
    {
        using (var con = new SqlConnection(connectionString))
        {
            con.Open();
            using (var cmd = new SqlCommand(SQLQuery, con))
            {
                for (var i = 0; i < 20; i++)
                {
                    cmd.Parameters.AddWithValue("@RText", Rtext);
    
                    // add for next iterations
                    if (i > 0)
                    {
                        date = date.AddDays(56);
                    }
    
                    cmd.Parameters.AddWithValue("@TDate", date);
    
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear(); // clear existing parameters for next iteration
                }
            }
        }
    }
    else
    {
        // handle invalid dates
    }
    

    如果数据类型完全已知,请使用 Parameters.Add() 而不是 Parameters.AddWithValue()