0

使用:

  • マイクロソフト SQL Server 2008
  • マイクロソフト ビジュアル スタジオ 2010
  • C#
  • .NET 4.0
  • Winフォーム

これは私のストアドプロシージャです。締め切りが 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

手順はうまく機能し、かなり高速です(方法がわからない)。どうやって更新するかが今の悩みです。

OldParetoとの 2 つのテーブルのみを更新したいNewPareto

データは、列である 1 つの列からのみ取得されNewParetoます。これにより、両方のテーブルの列が更新されます。

通常は、とを使用したコード内の単純な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
)

明らかに、列の型が一致しないため、適切に入力する必要があります。select を使用して挿入を実行します。

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 に答える