【问题标题】:Calling table-valued-function for each result in query为查询中的每个结果调用表值函数
【发布时间】:2011-01-25 09:51:19
【问题描述】:

假设我有这样的查询:

SELECT X FROM Table WHERE Y = 'Z'

如何使用上述查询中的每个X 作为参数来执行存储过程?

更新

我已将 SP 更改为表值函数。因此,对于函数的每次调用,它都会返回一个表。我需要做的是将所有这些结果存储在一个临时表中,并让我的 SP 返回这个表。

解决方案

在@cyberkiwi 的帮助下,终于设法让它工作了。这是我的最终解决方案:

DECLARE @Fields TABLE (
    Field int)

INSERT INTO @Fields (X) SELECT * FROM tvf_GetFields(@SomeIdentifier)
SELECT * FROM @Fields
CROSS APPLY dbo.tvf_DoSomethingWithEachField([@Fields].Field)

【问题讨论】:

  • 有没有可能将SP转换成函数?或者,如果 SP 必须保留,将其内容移到一个函数中,然后从 SP 和这段代码中调用该函数?
  • @Daniel:我已将 SP 转换为函数,但仍然无法正常工作。

标签: sql sql-server-2005 stored-procedures


【解决方案1】:

您可以从中生成一个批处理语句,然后执行它

DECLARE @sql nvarchar(max)

SELECT @sql = coalesce(@sql + ';', '')
              + 'exec sprocname ' + QuoteName(AField, '''')
FROM Table
WHERE AField2 = 'SomeIdentifier'
  AND AField is not null

EXEC (@sql)

在编辑(到 TVF)之前,您可以更改 SP 以继续填充临时表。

对 TVF 进行后期编辑,您可以使用交叉应用:

SELECT F.*
FROM Tbl CROSS APPLY dbo.TVFName(Tbl.AField) F
WHERE Tbl.AField2 = 'SomeIdentifier'

它将每次调用 Tbl.AField 的所有“表结果”返回到单个结果集中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2021-07-07
    • 2021-06-05
    相关资源
    最近更新 更多