Tsql 从列表中在T-SQL中创建一个循环

Tsql 从列表中在T-SQL中创建一个循环,tsql,Tsql,我有用C#编写的代码,但我想创建一个在服务器上运行的T-SQL脚本。这是我想转换为T-SQL的C#代码的一部分: var enumerator = distinctlist.GetEnumerator(); while (enumerator.MoveNext()) { mtbn dtb = enumerator.Current as mtbn; var user = users.Where(x => x.Name == dtb.UserNa

我有用C#编写的代码,但我想创建一个在服务器上运行的T-SQL脚本。这是我想转换为T-SQL的C#代码的一部分:

var enumerator = distinctlist.GetEnumerator();
    while (enumerator.MoveNext())
    {
        mtbn dtb = enumerator.Current as mtbn;
        var user = users.Where(x => x.Name == dtb.UserNameTb).FirstOrDefault();
        var action = actions.Where(x => x.Name == dtb.ActionTb.Value.ToString()).FirstOrDefault();
        var project = projects.Where(x => x.Name == dtb.ProjectNameTb).FirstOrDefault();
        var transaction = transactions.Where(x => x.Name == dtb.TransactioNameTb).FirstOrDefault();
        TransactBoard transactBoard = dbContext.TransactBoard.Add(new TransactBoard
        {
            User = user != null ? user : new EF.User { Name = dtb.UserNameTb },
            Action = action != null ? action : new EF.Action { Name = dtb.ActionTb.Value.ToString() },
            Project = project != null ? project : new Project { Name = dtb.ProjectNameTb, Path = @"S:\\xxxx\\" + dtb.ProjectNameTb },
            Transaction = transaction != null ? transaction : new Transaction { Name = dtb.TransactioNameTb },
            DateTime = dtb.WriteDateTimeTb.Value
        });
        dbContext.MonitorControl.Add(
        new MonitorControl
        {
            ElementId = dtb.ElementIdTb.Value,
            Category = category.Where(x => x.Id == dtb.CategoryIdTb).FirstOrDefault(),
            TransactBoard = transactBoard
        });
    }
这就是我在T-SQL上所做的:

begin tran            
    insert dbo.TransactionBoard(TrancationId, UserId, ActionId, ProjectId, [DateTime] )
    select t.Id as TrancationId, u.Id as UserId, s.ActionTb, p.Id as ProjectId, s.WriteDateTimeTb
    from monitorControlDb.dbo.MonitorlControlTable s
        left join dbo.[Transaction] t
        on t.[Name] = s.TransactioNameTb 
        left join dbo.[User] u
        on u.[Name] = s.UserNameTb 
        left join dbo.Project p
        on p.[Name] = s.ProjectNameTb
    insert dbo.MonitorControl(ElementId, CategoryId)
    select s.ElementIdTb, s.CategoryIdTb
    from monitorControlDb.dbo.MonitorlControlTable s   
commit

您有SQL探查器(SSMS)吗?您可以使用它来收集LINQ发送到DB的查询吗?它会给你一些好的提示,让你更容易找到答案。如何在tsql中实现一个循环?实际上,你的SQL看起来很完美。它将自动循环遍历结果集(来自SELECT语句)并插入所有行。你试过了吗?结果是什么?我已经运行了三次脚本,之后TransactionId再也不会出现在MonitorControl中,即使TransactionBoard有一个标识(1,1)和MonitorControls的约束,当您只运行select语句(没有INSERT)时会得到什么?如
从monitorControlDb.dbo.MonitorControlTable s中选择s.ElementIdTb、s.CategoryIdTb
可能
monitorControlDb.dbo。MonitorControlTable
为空