【问题标题】:SQL Server 2008 : assigning record set to variablesSQL Server 2008:将记录集分配给变量
【发布时间】:2015-02-26 01:54:50
【问题描述】:

我使用的是 SQL Server 2008。 我需要能够通过存储过程参数传递表输出。

示例:MyTable (col1, col2) 有以下数据:

1, 'A'
2, 'B'
3, 'C'

存储过程:

sp_read_tbl (@p1_col1 int     OUT,
             @p1_col2 char(1) OUT,
             @p2_col1 int     OUT,
             @p2_col2 char(1) OUT,
             @p3_col1 int     OUT,
             @p3_col2 char(1) OUT)

如何在存储过程中做到这一点?

【问题讨论】:

  • 听起来你在做一些奇怪的事情。你可以插入@table ... exec sp_read_tbl 吗?然后只选择过程中的记录?
  • 您期望所有这些变量都超过参数?为什么不直接做一个select col1, col2 from yourDataSource order by col1?似乎您使用了足够的输出参数来保证 SP 只是选择/返回值是吗?

标签: sql-server sql-server-2008


【解决方案1】:

如上所述,这不是您从存储过程中的表中获取数据的常用方法。而且,如果您的表有第四行,您不仅要重新执行存储过程,还要重新执行调用它的代码。

但如果你真的需要这样做,你可以。有很多方法;我的看起来像这样:

-- DO NOT start your stored procs with "sp_".  That's reserved for MS.
-- Many people use "up_" as a substitute.  
create procedure dbo.up_read_tbl 
(  
         @p1_col1 int     OUT,
         @p1_col2 char(1) OUT,
         @p2_col1 int     OUT,
         @p2_col2 char(1) OUT,
         @p3_col1 int     OUT,
         @p3_col2 char(1) OUT
)
AS 
    SELECT top 1
           @p1_col1 = col1
       ,   @p1_col2 = col2
    FROM   dbo.MyTable

    SELECT top 1
           @p2_col1 = col1
       ,   @p2_col2 = col2
    FROM   dbo.MyTable
    WHERE  col1 <> @p1_col1

    SELECT top 1
           @p3_col1 = col1
       ,   @p3_col2 = col2
    FROM   dbo.MyTable
    WHERE  col1 <> @p1_col1
      AND  col1 <> @p2_col1

【讨论】:

  • 谢谢你上面的回答。是的,有点奇怪,但这是呼叫应用程序的限制。有没有办法通过游标循环获取来做到这一点?谢谢。
  • @learningSQL 你的意思是在存储过程中使用游标吗?你当然可以,但是如果你的表中有足够的记录来使用游标比我做的更实用,那么你会谈论几十个输出参数。另外,您需要一大段 T-SQL 代码来确定每次迭代更新哪些参数。
  • @learningSQL 不过,这里有一个想法:您的调用应用程序可以处理 XML 吗?您可以在单个输出参数中将整个表格内容作为 XML 返回。然后您可以将该 XML 转换为 DataTable 或 XmlDocument 或 XDocument 以进行进一步处理。
  • 嗨,是的,我的意思是在存储过程中使用游标。你能告诉我这样的代码吗?调用应用程序不处理 XML。谢谢。
  • @learningSQL 请问为什么要使用游标?如果使用游标,它会运行得更慢,代码也更难理解。
猜你喜欢
  • 2020-01-01
  • 2012-03-21
  • 1970-01-01
  • 2011-03-20
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多