Sql server 使用存储过程进行计算
我目前正在从事一个项目,该项目将在MS SQL数据库中存储有关我们客户的特定财务信息。之后,我们的用户需要能够查询数据库,以根据特定标准(例如,大于特定大小的客户机、位于特定地理位置的客户机)从客户机返回数据,并将其合计以用作基准。我们的财务软件将使用脚本访问数据库 我目前正在为数据库编写存储过程。我计划做的是根据可以使用的不同类型的标准编写几个不同的存储过程。他们将返回客户号码 我的实际问题是检索数据的方法。我需要用客户的数据做几个不同的计算。让不同的存储过程根据客户机编号进行计算并返回结果是更好的做法,还是让存储过程返回有关客户机的所有信息并在脚本中执行计算更好Sql server 使用存储过程进行计算,sql-server,database,stored-procedures,Sql Server,Database,Stored Procedures,我目前正在从事一个项目,该项目将在MS SQL数据库中存储有关我们客户的特定财务信息。之后,我们的用户需要能够查询数据库,以根据特定标准(例如,大于特定大小的客户机、位于特定地理位置的客户机)从客户机返回数据,并将其合计以用作基准。我们的财务软件将使用脚本访问数据库 我目前正在为数据库编写存储过程。我计划做的是根据可以使用的不同类型的标准编写几个不同的存储过程。他们将返回客户号码 我的实际问题是检索数据的方法。我需要用客户的数据做几个不同的计算。让不同的存储过程根据客户机编号进行计算并返回结果是
性能可能是一个问题,因为数据库中会有很多客户端,所以我希望该方法具有合理的效率。我认为这很大程度上与所涉及的数据和您正在执行的操作有关。我通常会发现,当进行计算以减少DB(分组和聚合)返回的大小时,在DB中进行计算更有效。当你开始做其他的计算时,它并没有那么清晰。我认为这在很大程度上与所涉及的数据和你正在做的操作有关。我通常会发现,当进行计算以减少DB(分组和聚合)返回的大小时,在DB中进行计算更有效。当您开始进行其他计算时,它并没有那么清晰。在大多数情况下,就像我想您描述的那样,使用存储过程更有效,但是在一些边缘情况下,它不是。最好的答案是尝试两种方法,并进行一些负载测试,以确定哪种方法最有效。在大多数情况下,如我认为您描述的情况,使用存储过程更有效,但也有一些边缘情况并非如此。最好的答案是两种方法都尝试一下,并进行一些负载测试,以确定哪种方法最有效。有趣的是,数据仓库人员一直都在这样做。他们通常使用最简单的SQL(选择SUM/COUNT…groupby…),并使用报表编写工具在数据库之外完成工作
我认为您应该获得一份数据仓库工具包的副本,并看看如何以一种更简单的方式完成这项工作。更灵活,可能更具可扩展性。有趣的是,数据仓库人员一直在这样做。他们通常使用最简单的SQL(选择SUM/COUNT…groupby…),并使用报表编写工具在数据库之外完成工作
我认为您应该获得一份数据仓库工具包的副本,并看看如何以一种更简单的方式完成这项工作。更灵活,可能更具可扩展性。SQL Server是一种关系数据存储。我建议每个计算一个存储过程,它对客户端执行相同的计算。只需将ID作为参数传入即可获得客户机的特定结果 “性能可能是一个问题,因为会有很多客户机”…这取决于表的规范化和索引方式。除非您完全了解索引的真正含义,否则不要为每一列编制索引
编辑~同时查看您的计算结果。有些可以卸载到前端客户端。SQL Server是一个关系数据存储。我建议每个计算一个存储过程,它对客户端执行相同的计算。只需将ID作为参数传入即可获得客户机的特定结果 “性能可能是一个问题,因为会有很多客户机”…这取决于表的规范化和索引方式。除非您完全了解索引的真正含义,否则不要为每一列编制索引
编辑~同时查看您的计算结果。有些可以卸载到前端客户端。从您的问题中可以看出,最有效的方法是在SP中执行所有计算,并将单个(?)结果返回到脚本中
如果您决定在脚本中执行处理,则应确保仅将检索的数据限制在必要的范围内,并确保尽可能少地往返数据库。从您的问题听起来,最有效的方法是在SP中执行所有计算并返回将单个(?)结果添加到脚本中
如果您决定在脚本中进行处理,则应确保仅将检索的数据限制在必要的范围内,并确保尽可能少地往返数据库。这取决于操作。很可能将这些内容作为数据库中的计算列,在视图或SP中预先计算(或使用UDF),在ETL或汇总阶段单独计算并存储,或者让客户机进行计算
我会避免让客户做任何事情,除非你知道你可以始终如一地控制计算,这样他们就不会犯错误(所有独立完成工作的报告编写者都会导致灾难),特别是如果计算规则可能会改变的话。这实际上取决于操作。很可能将这些内容作为数据库中的计算列,在视图或SP中预先计算(或使用UDF),在ETL或汇总阶段单独计算并存储,或者让客户机进行计算 我会避免让客户做任何事情
Declare @SUMAmount decimal(12,3)
Select @SUMAmount= SUM(ISNULL(@A,0)+ISNULL(@B,0)+ISNULL(@C,0)+ISNULL(@D,0))
Select @SUMAmount= SUM((ISNULL(@A,0)+ISNULL(@B,0))*(ISNULL(@C,0)-ISNULL(@D,0)))
Select A,B,SUM(C),D From TableName
Where SUM(C)>0
Group By A,B,D
Declare @TotalNoofDays int
@TotalNoofDays = DATEDIFF(d, fromdate, todate)
if @DueAmount >=0
BEGIN
IF @DiscountFlag = 1
BEGIN
SET @DueIntAmount = 0
END
ELSE
BEGIN
SET @DueIntAmount = ((@DueAmount*(@IntRateOnDue/100))/365)*@NoofDays
END
SET @ExcessInterestAmount = 0
END
ELSE
BEGIN
SET @DueIntAmount = 0
SET @ExcessInterestAmount = ((@DueAmount*(@IntRateOnDeposit/100))/365)*@NoofDays
END
Create Proc NewLearningProcedure
(
@Name Varchar(50),
@Date DateTime
)
AS
Begin
Declare @Temp Table
(
ID int Identity(1,1),
Name Varchar(50),
Date DateTime
)
Insert Into @Temp
Select @Name,@Date
Declare @i int
set @i=10
While @i>0
Begin
Insert Into @Temp
Select @Name+CAST(@i as varchar(50)),@Date
Set @i=@i-1
End
Select * from @Temp
End