Tsql 鸡和蛋问题数据库

Tsql 鸡和蛋问题数据库,tsql,stored-procedures,sybase,Tsql,Stored Procedures,Sybase,我将Sybase DB与TSQL一起使用 我尝试在两个存储过程之间工作,一个嵌套在另一个存储过程中 我的外部存储过程将创建一个临时表#temp_table,并用值填充到200。使用200个条目填充临时表后,内部存储过程将使用该表进行联接 因此,基本上,我的外部存储过程将具有以下内容(简化): 我的内部存储过程将包含以下内容: SELECT SOME_COLUMNS FROM SOME_TABLE INNER JOIN #temp_table ON SOME_CONDITION

我将Sybase DB与TSQL一起使用

我尝试在两个存储过程之间工作,一个嵌套在另一个存储过程中

我的外部存储过程将创建一个临时表
#temp_table
,并用值填充到200。使用200个条目填充临时表后,内部存储过程将使用该表进行
联接

因此,基本上,我的外部存储过程将具有以下内容(简化):

我的内部存储过程将包含以下内容:

SELECT
  SOME_COLUMNS
FROM
  SOME_TABLE
INNER JOIN
  #temp_table
ON
  SOME_CONDITION
当我尝试测试时,我为我的内部存储过程运行脚本,它抱怨
#temp_table
不存在,并且无法在数据库中创建存储过程。因此,当我尝试运行外部存储过程时,它也会失败


我可以得到一些关于如何解决这个问题的建议吗?

不要在两个存储过程中完成。一气呵成。一个存储过程可以包含完成作业所需的任意多个SQL语句,临时表仅在创建它的存储过程的上下文中可用

CREATE PROC DoItAll
AS

   CREATE TABLE #temp_table 
   (
     ... columns ...
   );

   SELECT
     SOME_COLUMNS
   FROM
     SOME_TABLE
   INNER JOIN
     #temp_table
   ON
     SOME_CONDITION;

不要在两个存储过程中执行此操作。一气呵成。一个存储过程可以包含完成作业所需的任意多个SQL语句,临时表仅在创建它的存储过程的上下文中可用

CREATE PROC DoItAll
AS

   CREATE TABLE #temp_table 
   (
     ... columns ...
   );

   SELECT
     SOME_COLUMNS
   FROM
     SOME_TABLE
   INNER JOIN
     #temp_table
   ON
     SOME_CONDITION;

您可以在创建过程之前创建表:

CREATE TABLE #temp_table 
(
  ... columns ...
)
go

CREATE PROC DoItAll
AS


   SELECT
     SOME_COLUMNS
   FROM
     SOME_TABLE
   INNER JOIN
     #temp_table
   ON
     SOME_CONDITION
go

我在工作中经常这样做,在过程之间发送多个数据。

您可以在创建过程之前创建表:

CREATE TABLE #temp_table 
(
  ... columns ...
)
go

CREATE PROC DoItAll
AS


   SELECT
     SOME_COLUMNS
   FROM
     SOME_TABLE
   INNER JOIN
     #temp_table
   ON
     SOME_CONDITION
go

我在工作中经常这样做,在程序之间发送多个数据。

最后我得到了我这个问题的答案。这是我以前的困境。我不仅有一个join,还有很多其他存储过程也需要处理。因此,如果我将它们全部放入一个存储过程中,那么一个存储过程(可能)将增长到几百行。这是可以接受的/好的做法吗?这有点主观。我见过一些可怕的存储过程。我讨厌调试它们,但如果有必要使用大型存储过程来完成工作,那么这是必要的。如果我不在一个存储过程中完成所有工作,您会建议其他替代方案吗?我不知道您的情况。这在很大程度上取决于许多因素,但如果可以使用视图而不是#诱人的,则有一种选择。就个人而言,如果我必须这样做,我会在代码中,在.NET数据集中,创建一个内存中的DataTable对象,而不是在服务器上创建一个临时表,但这只是因为这是我最熟悉的。我甚至不知道你是一个.NET开发人员,使用另一种工具,还是纯粹的SQL开发人员。其他选项变得更加混乱-导出到一个真正的表,创建它,使用它,然后删除它,等等。谢谢你的想法。我只使用SQLATM,并从shell脚本调用存储过程。我将把它们都放进一个狂欢节。最后我得到了我这个问题的答案。这是我以前的困境。我不仅有一个join,还有很多其他存储过程也需要处理。因此,如果我将它们全部放入一个存储过程中,那么一个存储过程(可能)将增长到几百行。这是可以接受的/好的做法吗?这有点主观。我见过一些可怕的存储过程。我讨厌调试它们,但如果有必要使用大型存储过程来完成工作,那么这是必要的。如果我不在一个存储过程中完成所有工作,您会建议其他替代方案吗?我不知道您的情况。这在很大程度上取决于许多因素,但如果可以使用视图而不是#诱人的,则有一种选择。就个人而言,如果我必须这样做,我会在代码中,在.NET数据集中,创建一个内存中的DataTable对象,而不是在服务器上创建一个临时表,但这只是因为这是我最熟悉的。我甚至不知道你是一个.NET开发人员,使用另一种工具,还是纯粹的SQL开发人员。其他选项变得更加混乱-导出到一个真正的表,创建它,使用它,然后删除它,等等。谢谢你的想法。我只使用SQLATM,并从shell脚本调用存储过程。我会把它们都放进一场狂欢中。