0

使用:

  • 微软 SQL 服务器 2008
  • 微软视觉工作室 2010
  • C#
  • .NET 4.0
  • WinForms

好的,这是我的存储过程。振作起来,因为我有 24 小时的最后期限,所以昨天我下班时有人告诉我(是的,我很生气)。

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[MyPareto]
    @pgParam varchar(255)
AS
   SELECT i.pg,
   dbo.OldParetoAnalysis.Pareto,
   i.part,
   i.sales6months,
   a.LostSales6Months,
   dbo.NewParetoAnalysis.Pareto

FROM
OPENQUERY(SACBAUTO, 'SELECT dbo.iLines.Part,
                            dbo.iLines.Pg,
                            SUM(dbo.iLines.Qty) as sales6months,
                            dbo.iLines.Prefix 
                     FROM Autopart.dbo.iLines 
                     where prefix = ''i''
                     and [datetime] > dateadd(month, -6, getdate())
                     group by 
                     dbo.ilines.pg,
                     dbo.ilines.part,
                     dbo.ilines.prefix
                     order by sales6months desc') i
RIGHT JOIN
dbo.OldParetoAnalysis
on
i.part collate SQL_Latin1_General_CP1_CI_AS = dbo.OldParetoAnalysis.Part
INNER JOIN
dbo.NewParetoAnalysis
ON
dbo.OldParetoAnalysis.Part collate SQL_Latin1_General_CP1_CI_AS =    dbo.NewParetoAnalysis.Part

LEFT JOIN
OPENQUERY(SACBAUTO, 'SELECT dbo.aLines.Part,
                            dbo.aLines.Pg,
                            SUM(dbo.aLines.Qty) as LostSales6Months,
                            dbo.aLines.Prefix 
                     FROM Autopart.dbo.aLines 
                     where prefix = ''d''
                     and [datetime] > dateadd(month, -6, getdate())
                     group by 
                     dbo.alines.pg,
                     dbo.alines.part,
                     dbo.alines.prefix
                     order by LostSales6Months desc') a
ON
dbo.NewParetoAnalysis.Part collate SQL_Latin1_General_CP1_CI_AS = a.part
/*FULL OUTER JOIN
dbo.NewParetoAnalysis
ON
a.part collate SQL_Latin1_General_CP1_CI_AS = dbo.NewParetoAnalysis.Part*/
WHERE
i.pg = @pgParam
GROUP BY
   i.pg,
   dbo.OldParetoAnalysis.Pareto,
   i.part,
   i.sales6months,
   a.LostSales6Months,
   dbo.NewParetoAnalysis.Pareto
ORDER BY
dbo.OldParetoAnalysis.Pareto asc

程序效果很好,也很快(不知道如何呵呵)。我现在遇到的问题是如何更新。

我只想更新 2 个表:OldParetoNewPareto.

数据将仅来自一列,即该NewPareto列。这将更新两个表中的列。

通常它只是在代码中使用and的一个简单UPDATE调用。SqlDataAdapterDataSet

但是由于我有这个疯狂的存储过程,我对它是如何工作的感到困扰。

您需要的任何 C# 代码都可以告诉我。

非常感谢!

4

2 回答 2

1

一个冗长的方法就是在我的代码中将新的帕累托放入一个新表中,然后使用该表来更新我的 2 个 sql 表

或者在 sql 过程本身。我仍然不明白您的对象及其关系是什么,但这里是执行类似更新的一般方法:

首先在程序开始时声明临时表:

declare @tmpTable table 
(
  pg int, 
  oldPareto int, 
  part int, 
  sales6months int, 
  LostSales6Months int,
  newPareto int
)

显然,列类型与您的不匹配,因此您需要正确键入它们。使用您的选择执行插入:

insert into @tmpTable 
     (pg, oldPareto, part, sales6months, LostSales6Months, newPareto)
     select ...

然后执行更新:

update oldPareto
   set oldPareto = a.oldPareto,
       newPareto = a.newPareto
  from oldPareto
    inner join @tmpTable a
       on ... -- However you join oldPareto table with results of query

update newPareto
   set oldPareto = a.oldPareto,
       newPareto = a.newPareto
  from newPareto
    inner join @tmpTable a
       on ... -- However you join newPareto table with results of query
于 2012-04-04T10:06:53.343 回答
0

在“dbo.OldParetoAnalysis.Pareto asc”下面写一段PL/SQL代码

例如: UPDATE OldPareto,NewPareto SET OldPareto.NewPareto = 'value' ...

参考这个: -

[http://www.java2s.com/Tutorial/MySQL/0140__Insert-Update-Delete/Updatetwotablesinoneupdatestatement.htm]

于 2012-04-04T09:17:58.517 回答