我有三个表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中的所有记录。我不知道如何修改存储过程。
感谢您的帮助。
答案 0 :(得分:0)
如果我已经理解了您正在尝试正确执行的操作,那么这可能是我更愿意实施解决方案的方式。
我会将2个数据表作为TABLE变量传递给SP - 类似于下面,然后根据需要使用SET操作将UPIN用于UPDATE和DELETE - 从而影响一个查询中的多行并避免单独循环遍历每一行。 / p>
正如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