【问题标题】:Accessing table returning by table-valued function from SP从 SP 访问表值函数返回的表
【发布时间】:2018-01-22 07:38:35
【问题描述】:

我有表值函数

ALTER FUNCTION [dbo].[fn_Functiont]()
RETURNS TABLE 
AS
RETURN 
(   
SELECT d.*, b.Name AS Name, ps.Name AS PaymentSystemName, c.UserName AS UserName, c.FirstName AS ClientFirstName, c.LastName AS LastName, c.Number AS DocumentNumber, c.Id
FROM Document AS d
JOIN System AS ps ON d.SystemId = ps.Id
JOIN Client AS c ON c.Id = d.ClientId
LEFT JOIN Shop AS b ON b.Id = d.ShopId
WHERE d.OperationTypeId IN (2, 4, 5) AND c.Type = 1
)

还有SP。在那个 SP 我已经声明了这样的临时表

DECLARE @tempTable AS TABLE 
(
   .. columns here ...
)

在声明我只是插入信息之后

INSERT INTO @tempTable
SELECT * FROM [dbo].[fn_Functiont]()
Select @column1,colum2...,from @tempTable

问题是我必须在@temptable 中声明很多列并且代码看起来很丑。那么有没有更好的方法从表值函数中读取SP 中的行?

【问题讨论】:

  • 您的 内联表值函数 不带任何参数(这就是它的本意)。这样做与VIEW 完全一样。顺便说一句:你最好不要使用*,如果你的底层对象发生变化,这会产生愚蠢的错误......
  • 实际问题是什么?为什么要将结果存储在表中?您可以将该函数完全用作查询中的任何 real 表...
  • 我可以直接对这个函数进行选择查询吗?我只想从函数返回的表中检索信息并最终从 SP 中返回该信息
  • 是的,只需使用SELECT * FROM dbo.fn_Functiont() AS SomeAlias;。您可以在查询中使用它(作为任何表或视图),甚至在连接等中。最好使用AS SomeAlias 为函数提供一个临时名称,该名称可以在查询中使用(例如加入)
  • 感谢您的回答

标签: sql sql-server tsql stored-procedures stored-functions


【解决方案1】:

代替表变量@tempTable 使用临时表并试试这个

SELECT * INTO #tempTable FROM [dbo].[fn_Functiont]()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-23
    • 2016-03-20
    • 2018-06-08
    • 2010-12-28
    • 2011-04-24
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多