对于在另一个表中找到的每一行,我必须在表中插入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
答案 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);
或者,如果您的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