【问题标题】:C# and SQL Server: updating trouble with stored proceduresC# 和 SQL Server:更新存储过程的问题
【发布时间】:2012-04-04 09:09:55
【问题描述】:

使用:

  • Microsoft SQL Server 2008
  • Microsoft Visual Studio 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 列。这将更新两个表中的列。

通常它只是在代码中使用SqlDataAdapterDataSet 进行简单的UPDATE 调用。

但是由于我有这个疯狂的存储过程,我很困惑它是如何工作的。

如果您需要任何 C# 代码,请告诉我。

非常感谢!

【问题讨论】:

  • newPareto 和 oldPareto 表与此查询的结果有何关联?
  • 我的数据网格中的第一列是旧的帕累托。旧的 perato 和新的只是自动编号(将 pareto 视为最畅销零件的联盟)。新的帕累托是相同的数据,但我的老板将出于他需要的任何原因编辑该列。然后我需要一个更新查询来更新两个表中的新旧字段。是不是更清楚了?
  • 在我的代码中将新的帕累托放入一个新表中,然后使用该表更新我的 2 个 sql 表。唯一的问题是它似乎有很长的路要走,所以我希望有一个更快的解决方案

标签: c# sql-server-2008 stored-procedures sql-update


【解决方案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

【讨论】:

  • 这看起来非常简单而且做得很好。非常感谢,这让我很费心,如果我遇到困难/完成它,我会开始并更新你。
  • 可能听起来很傻,但更新会去哪里?新的 sql 语句还是在同一个过程中?如果在同一个过程中,那么在哪里呢?会在最后吗? (对不起,如果这看起来像一个愚蠢的问题,但你可能会说 SQL 不是我的强项)
  • 哦,顺便说一句,一旦我更新了我的临时表,那将如何更新需要更新的表,oldpereto 和 newpareto?
  • 更新在插入...选择部分之后进行。但是您应该首先创建该过程的副本或将其保存到文件中,以便能够比较/恢复可能的错误。
  • 查询结果插入到临时表中。该表稍后用于匹配和更新 oldPareto 和 newPareto 中的行。注意inner join @tmpTable a 在两次更新中。
【解决方案2】:

在“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]

【讨论】:

  • 刚刚注意到,该死。还有什么建议吗?
猜你喜欢
  • 2011-11-07
  • 2012-04-18
  • 2021-09-25
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多