Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将存储过程中的数据使用到第二个过程中?_Sql_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 如何将存储过程中的数据使用到第二个过程中?

Sql 如何将存储过程中的数据使用到第二个过程中?,sql,sql-server-2008,stored-procedures,Sql,Sql Server 2008,Stored Procedures,在过去的几个月里,我学到了很多,这要感谢论坛上所有的话题,感谢每个人都在努力回答它们。他们帮我制定了程序,但现在我陷入了困境。 到目前为止,相关话题还没有给我一个解决方案 还查看了此页面: 让我解释一下情况: 我创建了两个程序,它们工作得非常好。他们用临时桌子工作 下面我已经写了尽可能具体的(我希望)。如果需要进一步的信息,我当然可以提供 这两个过程: 1-由自己的司机、卡车、油耗计算成本 2-行程收入和成本的计算(订单收入、运输成本、通行费成本等)指定行程利润 我需要添加到第二个程序(Trip

在过去的几个月里,我学到了很多,这要感谢论坛上所有的话题,感谢每个人都在努力回答它们。他们帮我制定了程序,但现在我陷入了困境。 到目前为止,相关话题还没有给我一个解决方案

还查看了此页面:

让我解释一下情况:

我创建了两个程序,它们工作得非常好。他们用临时桌子工作

下面我已经写了尽可能具体的(我希望)。如果需要进一步的信息,我当然可以提供

这两个过程:

1-由自己的司机、卡车、油耗计算成本

2-行程收入和成本的计算(订单收入、运输成本、通行费成本等)指定行程利润

我需要添加到第二个程序(Trip_margin)中的是第一个程序(CostOM)的计算金额,该程序位于名为“CostOwnMat”(表示自有材料成本)的列中

这两个过程使用相同的主键结构,即tripnumber

它们唯一的区别在于,程序1可以多次使用相同的tripnumber,因为一次行程可以由2名或更多驾驶员完成

因此,我需要“CostOwnMat”的总和,并在第二个过程中在名为“total_cost_OM”的新列中返回它

当我有了这些,我就有了旅行的所有收入、成本等,来计算旅行的利润

我认为下面是解决方案的方向,但如何应用它?

•表变量(DECLARE@t Table)仅对创建它的连接可见,并在批处理或存储过程结束时删除

•本地临时表(CREATE TABLE#t)仅对创建它的连接可见,并且在连接关闭时被删除

•全局临时表(CREATE TABLE##t)对每个人都可见,并且在所有引用它们的连接关闭时被删除


•Tempdb永久表(使用Tempdb CREATE TABLE t)对每个人都可见,并且在服务器重新启动时被删除。

您可以使用第二种解决方案,即本地temp TABLE

然而,使用这种解决方案时,当并发用户在实时应用程序中使用相同的过程时,您需要小心

为此,首先需要按照流程创建具有唯一名称的临时表,如下所示:

EXEC ('CREATE TABLE #tmpTable' + CAST(@@SPID AS VARCHAR) + ' 
(fld1 INT NULL) ');
第二件事是当您需要在第二个/另一个过程中使用时,表的存在:

IF OBJECT_ID('tempdb..#tmpTable') 
BEGIN
     -- your code
END

您可以使用第二种解决方案,本地临时表

然而,使用这种解决方案时,当并发用户在实时应用程序中使用相同的过程时,您需要小心

为此,首先需要按照流程创建具有唯一名称的临时表,如下所示:

EXEC ('CREATE TABLE #tmpTable' + CAST(@@SPID AS VARCHAR) + ' 
(fld1 INT NULL) ');
第二件事是当您需要在第二个/另一个过程中使用时,表的存在:

IF OBJECT_ID('tempdb..#tmpTable') 
BEGIN
     -- your code
END

如果从一个存储过程调用另一个存储过程,则可以使用本地临时表,其数据将在被调用的存储过程中可见。唯一的缺点是,在调用的过程中,您应该使临时表存在。嗨,Jeremy,当阅读您的评论时,我开始认为我已经在测试中这样做了。只是因为一个错误,我想我必须找到另一个解决方案。所以我又试了一次,简化了,成功了。所以现在我也为问题中的SP做了这件事。谢谢你的回答给了我一个方向。如果从一个存储过程调用另一个存储过程,则可以使用本地临时表,其数据将在被调用的存储过程中可见。唯一的缺点是,在调用的过程中,您应该使临时表存在。嗨,Jeremy,当阅读您的评论时,我开始认为我已经在测试中这样做了。只是因为一个错误,我想我必须找到另一个解决方案。所以我又试了一次,简化了,成功了。所以现在我也为问题中的SP做了这件事。谢谢你的回答给了我一个方向。关于ArnoHi Bhavesh,在这一点上,我做了一些实验,我让它按照我想要的方式运行。我用一个更简单的SP进行了测试。这很有效,所以我在问题中也做了同样的测试。我使用了全局temp,比如create table##CostEM_tb(col1,col2,…)。它成功了。我想我理解你的警告。但我不认为这是个问题。该程序将用于自动报告。阿诺希·巴维斯,在这一点上,我做了一些实验,我让它按照我想要的方式运行。我用一个更简单的SP进行了测试。这很有效,所以我在问题中也做了同样的测试。我使用了全局temp,比如create table##CostEM_tb(col1,col2,…)。它成功了。我想我理解你的警告。但我不认为这是个问题。该程序将用于自动报告。你好,阿诺