SQL模拟foreach

时间:2015-06-13 21:03:22

标签: c# sql-server

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

1 个答案:

答案 0 :(得分:7)

为什么你不能在SELECT中使用INSERT INTO语句?

INSERT INTO tbl (tbl.ResNo)
SELECT ResNo FROM Res WHERE TSGrNo = 1

如果SELECT语句返回6行,则将插入6行

Adding Rows by Using INSERT and SELECT

评论后更新:
插入值(如果尚不存在)
根据SQL Server的版本,您可以使用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