字符串值在插入语句中的C#SQL循环

时间:2018-11-23 08:49:04

标签: c# sql sql-server loops

我有一个insert语句,它将在表中创建一个新行:

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 个答案:

答案 0 :(得分:2)

首先,您应该对查询进行参数设置。我的C#非常生锈(可怜),因此,如果这是错误的话,您必须原谅我,但是,如果我回想起(并且我的Google-fu工作了),那么您将想做些类似的事情:

import { withStyles } from '@material-ui/core/styles';

const styles = theme => ({
    container: {
        paddingRight: 15,
        paddingLeft: 15,
        marginRight: 'auto',
        marginLeft: 'auto',

        // Full width for (xs, extra-small: 0px or larger) and (sm, small: 600px or larger)
        [theme.breakpoints.up('md')]: {  // medium: 960px or larger
            width: 920,
        },
        [theme.breakpoints.up('lg')]: {  // large: 1280px or larger
            width: 1170,
        },
        [theme.breakpoints.up('xl')]: {  // extra-large: 1920px or larger
            width: 1366,
        },
    },
});

const MyContainer = () => (
    <div className={classes.container}>
        {/* Other stuff here */}
    </div>
);

export default withStyles(styles)(MyContainer);

虽然这不能解决重复项,所以第一行可以替换为:

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

或者,您可以使用rCTE代替虚拟Tally表。在SQL中,它看起来像:

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);";

如果您将要拥有大量的值,那么可伸缩的Tally表是您的最佳选择:

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;

从上面的意义上讲,rCTE是一种RBAR方法,因此您需要的行数越多,它的速度就会越慢。理货表会更快,不是RBAR,并且不需要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; 选项。

答案 1 :(得分:1)

查看正在使用的语法,似乎在C#中尝试它。因此,请使用以下代码。

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

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) );";
}

答案 2 :(得分:1)

我更喜欢使用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()

答案 3 :(得分:0)

您可以尝试一下。

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