c# - SQL模拟一个foreach

标签 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 INTO 中使用 SELECT 语句?

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

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

Adding Rows by Using INSERT and SELECT

评论后更新:
如果值不存在则插入值
根据 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 Server 版本早于 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 

关于c# - SQL模拟一个foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30823507/

相关文章:

sql - 如何将 db 对象数据类型从 varchar 更改为 nvarchar 而不默认为 null?

sql-server - 如何检测我是否有CREATE TABLE权限?

c# - 洗牌,dotnet 方式!!,算法的复杂度是否可以接受?

c# - 在 .NET 中,我什么时候必须引用外部库也引用的 DLL?

c# - 是否有任何时区实际正确使用 TimeZoneInfo IsFixedDateRule?

sql-server - 当列名中有空格时,选择查询不适用于 WHERE 子句

c# - Dapper 和用户定义的数据库类型

c# - 使用计时器将 List<class> 保存到 DB 时出现问题,并且 List 由多线程写入

sql - 原子独占 SQL 记录更新

asp.net - SQLException : Login failed for user 'NT AUTHORITY\NETWORK SERVICE