SQL 模拟一个 foreach



对于在另一个表中找到的每一行,我必须在表中插入 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 

最新更新