【问题标题】:Merge tables(add, update and delete records from different sources)合并表(添加、更新和删除来自不同来源的记录)
【发布时间】:2012-09-07 12:24:38
【问题描述】:

我有三个表 tb1、tb2 和 tbTotal。它们具有相同的模式。这些表包含三列,MetricID、Descr 和 EntryDE。

我想要的是将 tb1 与 tbTotal 合并。我已经这样做了,而且效果很好。 我的存储过程是:

CREATE PROCEDURE [dbo].[Admin_Fill] 
-- Add the parameters for the stored procedure here
@MetricId INT,
@Descr VARCHAR(100),
@EntryDE VARCHAR(20)
 AS

 BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--SET IDENTITY_INSERT dbo.tbTotal ON
-- Insert statements for procedure here
;WITH cte AS (SELECT MetricId=@MetricId,Descr=@Descr,EntryDE=@EntryDE)
 MERGE tbTotal d
 USING cte s
 ON s.EntryDE = d.EntryDE
 AND s.MetricId=d.MetricId
 WHEN matched THEN UPDATE
 set MetricId=s.MetricId,
     Descr=s.Descr,
     EntryDE=s.EntryDE
 WHEN not matched BY TARGET THEN
 INSERT(MetricId,Descr,EntryDE)
 VALUES (s.MetricId,s.Descr,s.EntryDE);
 END

我的 C# 代码:

        foreach (DataRow row in dt.Rows) // pass datatable dt1
        {
            MetricId = Convert.ToInt32(row["MetricId"]);
            Descr = row["Descr"].ToString();
            EntryDE = row["EntryDE"].ToString();
            parameters.Add("@MetricId", MetricId);
            parameters.Add("@Descr", Descr);
            parameters.Add("@EntryDE", EntryDE);
            dbaccess.ExecuteNonQuery(strStoredProcedure, parameters); //cmd.ExecuteNonQuery(); 
            parameters.Clear();
        }

我还想从 dtTotal 中删除 dt2 中的所有记录。我不确定如何修改存储过程。

感谢您的帮助。

【问题讨论】:

    标签: c# tsql stored-procedures datatable


    【解决方案1】:

    如果我已经理解您正在尝试正确执行的操作,那么这可能就是我希望实施解决方案的方式。

    我会将 2 个数据表作为 TABLE 变量传递给 SP - 类似于下面,然后使用 SET 操作根据需要使用 JOIN 来更新和删除 - 从而影响一个查询中的多行并避免分别循环遍历每一行。

    正如 AdaTheDev in the related answer 所提到的,您最终会创建一个“TABLE”类型,但是拥有一个额外的类型并没有什么缺点,而且这种解决方案的扩展性比循环方法要好得多。

    免责声明:- 下面的代码在语法上可能不正确,但我希望你能明白我的提议。

    CREATE TYPE TableType AS TABLE
    (
     MetricId INT, 
     Descr VARCHAR(300) --or whatever length is appropriate, 
     EntryDE INT
    );
    GO
    
    CREATE PROCEDURE [dbo].[Admin_Fill] 
      @RowsForUpdate TableType READONLY,
      @RowsForDelete TableType READONLY
    AS
    BEGIN
    
      -- Update all the Descriptions for all the rows
      UPDATE
        t
      SET
        t.Descr = u.Descr
      FROM
        tbTotal t 
      INNER JOIN @RowsForUpdate u
        ON t.EntryDE = u.EntryDE AND t.MetricId = u.MetricId
    
      -- Delete the rows to be deleted
      DELETE t 
      FROM tbTotal t
      INNER JOIN @RowsForDelete d
        ON t.EntryDE = u.EntryDE AND t.MetricId = u.MetricId
    
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2012-12-26
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      相关资源
      最近更新 更多