Во-первых, вы должны параметризовать свой запрос.Мой C # очень ржавый (плохой), поэтому вам придется извинить меня, если это не так, однако, если я вспомню (и мой Google-фу сработал), то вы захотите сделать что-то более похожее на:
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 вместо виртуальной таблицы Tally.В 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
.