【问题标题】:How to retrieve #temptable data that was created inside a stored procedure and SqlCommand?如何检索在存储过程和 SqlCommand 中创建的 #temptable 数据?
【发布时间】:2019-09-23 08:10:33
【问题描述】:

我在这里阅读了很多关于如何重用SqlCommand 的答案,但没有一个是这个问题的答案。基本上我有创建#temptable的存储过程。

类似这样的:

CREATE PROCEDURE [dbo].[ProjectPriorInterestIncome]
    @selectedDate Date,
    @EndDay Date
AS
BEGIN
    CREATE TABLE #LoanPriorProjected
    (
      Colums here....
    )
END

在我的 .Net 中,我有一个执行存储过程的 SqlCommand。像这样的:

Using cmd As New SqlCommand("ProjectPriorInterestIncome", SQLConn)
   cmd.CommandType = CommandType.StoredProcedure
   cmd.Parameters.AddWithValue("@SelectedDate", frmDefault.dtDate.Value)
   cmd.Parameters.AddWithValue("@EndDay", Format(GetLastDayofMonth(frmDefault.dtDate.Value), "12/31/yyyy"))
   cmd.ExecuteNonQuery()  

   'Executing a select query from #temptable'
   cmd.CommandText = "SELECT * FROM #LoanPriorProjected"
   cmd.CommandType = CommandType.Text
   cmd.ExecuteNonQuery()
End Using

现在,当我尝试从 #LoanPriorProjected 表中执行选择查询时,它说

无效的对象名称“#LoanPriorProjected”。

【问题讨论】:

  • 必须声明表变量。这是什么意思?
  • @DaleBurrell,实际上当我在服务器端运行查询时,一切正常。
  • Michal 是正确的,您需要一个全局临时表 (##)。在 proc 结束时会自动删除本地临时表。
  • @Suraj S 是正确的,您应该只选择存储过程中的结果,它们将返回到您的 c# 层。这样做的好处是您可以有多个 select 语句,并在结果集中获得多个表。

标签: sql .net sql-server vb.net global-temp-tables


【解决方案1】:

如果你想使用临时表数据,只需在过程中选择临时表数据,即select * from #LoanPriorProjected你的程序会以表格的形式返回结果,然后使用 datatable 来显示这个表格的数据。

【讨论】:

    【解决方案2】:

    临时表是...临时的 - 它们存在于一个连接中。所以在执行过程时,会创建表,然后命令完成,临时表就消失了。

    您可以使用双哈希##temptable 制作“更全局”的临时表。

    更多解释请参考this:

    经典临时表有两种形式,全局或可共享临时表,前缀为“##”,本地临时表,其名称前缀为“#”。本地临时表不太像普通表比全局临时表:您不能在它们上创建视图,或将触发器与它们关联。弄清楚是哪个进程、会话或过程创建了它们有点棘手。稍后我们将为您提供一些帮助。最重要的是,它们比全局临时表更安全,因为只有拥有进程才能看到它。

    【讨论】:

    • ##temp 表不需要您的方案,只需直接从存储的过程中返回结果。这在服务器上更轻,你可以建立两个连接。
    • @JonathanFreestone .NET 使用连接池,所以不是很贵:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多