0

3つのテーブルtb1、tb2、tbTotalがあります。それらは同じスキーマを持っています。テーブルには、MetricID、Descr、およびEntryDEの3つの列があります。

私が欲しいのは、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のすべてのレコードを削除したいと思います。ストアドプロシージャを変更する方法がわかりません。

手伝ってくれてありがとう。

4

1 に答える 1

0

あなたが正しくやろうとしていることを私が理解していれば、これは私がソリューションを実装することを好む可能性があります。

以下と同様に、2つのデータテーブルをTABLE変数としてSPに渡し、必要に応じてSET操作を使用してJOINを使用してUPDATEとDELETEの両方を使用します。したがって、1つのクエリで複数の行に影響を与え、各行を個別にループすることを避けます。

関連する回答でAdaTheDev が述べたように、「TABLE」型を作成することになりますが、余分な型を 1 つ持つことに欠点はなく、このソリューションはループ アプローチよりもはるかに優れたスケーリングを行います。

免責事項 :- 以下のコードは構文的に正しくない可能性がありますが、私が提案していることを理解していただければ幸いです。

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
于 2012-09-07T15:54:14.150 に答える