SQL 模拟一个 foreach
本文关键字:一个 foreach 模拟 SQL | 更新日期: 2023-09-27 17:55:54
对于在另一个表中找到的每一行,我必须在表中插入 7 行,我目前正在这样做这是我的 C# 应用程序,但对于相对较小的数据库来说速度非常慢。
我想将其移动到一个查询中,最好的方法是 foreach 循环,SQL 没有这个,所以必须使用 WHILE 循环。
但是我什至无法进入插入部分,因为我无法遍历行,这是我到目前为止的 SQL
DECLARE @cnt INT = 0;
SELECT ResNo FROM Res WHERE TSGrNo = 1;
print 'row cnt';
print @@RowCount; -- prints 0 even though 6 rows are returned
WHILE @cnt < @@Rowcount
BEGIN
print @cnt;
--In here I need to do this
-- INSERT INTO tbl (_,tbl.ResNo,_, _, _)
-- VALUES (_,Row.ResNo,_,_,_)
SET @cnt = @cnt + 1;
END
有谁知道更好的工作方法吗?
编辑:
这就是我现在所处的位置
DECLARE @_R1 INT = 7, @_Date INT = 20150608
SELECT *
FROM Res r
WHERE NOT EXISTS
(
SELECT *
FROM Vis_ResR rr
WHERE rr.ResNo = r.ResNo
AND rr.Date = @_Date
)
AND r.TSGrNo = 1
AND r.R1 = @_R1
INSERT INTO Vis_ResR (R1, ResNo, Vis_ResR.Date, FrTm, ToTm)
VALUES (@_R1,r.ResNo,@_Date,0,0)
@_R1和@_Date将在发送查询之前设置,我只是不明白如何使用 r.ResNo 值使其插入
为什么你不能在INSERT INTO
中使用SELECT
语句?
INSERT INTO tbl (tbl.ResNo)
SELECT ResNo FROM Res WHERE TSGrNo = 1
如果SELECT
语句返回 6 行,则将插入 6 行
使用插入和选择添加行
评论后更新:
插入值(如果尚不存在
)根据您可以使用的 SQL 服务器版本MERGE
DECLARE @_R1 INT = 7
DECLARE @_Date INT = 20150608
MERGE INTO Vis_ResR AS Target
USING (SELECT ResNo
FROM Res
WHERE TSGrNo = 1 AND R1 = @_R1) AS Source
ON Target.ResNo = Source.ResNo
WHEN NOT MATCHED THEN
INSERT (R1, ResNo, Vis_ResR.Date, FrTm, ToTm)
VALUES (@_R1, Source.ResNo, @_Date, 0, 0);
MERGE (Transact-SQL)
或者,如果您的 SQL 服务器版本早于 2008,请尝试下一步
DECLARE @_R1 INT = 7
DECLARE @_Date INT = 20150608
INSERT INTO Vis_ResR (R1, ResNo, Vis_ResR.Date, FrTm, ToTm)
SELECT @_R1, r.ResNo, @_Date, 0, 0
FROM Res r
WHERE NOT EXISTS (SELECT *
FROM Vis_ResR rr
WHERE rr.ResNo = r.ResNo
AND rr.Date = @_Date )
AND r.TSGrNo = 1
AND r.R1 = @_R1