【发布时间】: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