我有一个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
答案 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