sql表值函数返回的变量表

问题描述 投票:0回答:0
CREATE FUNCTION TableIncludesAlpha ( @table_name nvarchar(max), @objectid int ) RETURNS @table TABLE (variedTable) -- variedTable is of unknown size at function declaration AS BEGIN -- Get the SDE allocated alpha table registry DECLARE @tableNum nvarchar(max) SET @tableNum = (SELECT registration_id FROM networks.sde.SDE_table_registry t WHERE table_name = @table_name) -- Generate list of table columns, removing those we do not want DECLARE @cols nvarchar(max) SELECT @cols = STUFF((SELECT DISTINCT '], [' + name FROM sys.columns WHERE object_id = (SELECT TOP 1 object_id FROM sys.objects WHERE name = 'a' + @tableNum) AND name NOT IN ('SDE_STATE_ID', 'SHAPE') -- SDE_STATE_ID doesn't exist in primary table FOR XML PATH('') -- SHAPE is the gemotery field ), 1, 2, '') + ']'; -- generate the SQL query, returns all entries from all alpha tables ordered by the ESRI timecode 'SDE_STATE_ID' DECLARE @query nvarchar(max) = ' SELECT * FROM (SELECT a.SDE_STATE_ID as P_SDE_STATE_ID, d.*, ' + @cols + ' FROM networks.networks.a' + @tableNum + ' a LEFT JOIN networks.networks.d' + @tableNum + ' d ON d.SDE_DELETES_ROW_ID = a.OBJECTID AND a.SDE_STATE_ID = d.SDE_STATE_ID WHERE ObjectID = ' + @objectid + ' UNION SELECT -1 as P_SDE_STATE_ID, d.*, ' + @cols + ' FROM networks.networks.' + @table_name + ' a LEFT JOIN networks.networks.d' + @tableNum + ' d ON a.OBJECTID = d.SDE_DELETES_ROW_ID WHERE ObjectID = ' + @objectid + ') b ORDER BY b.P_SDE_STATE_ID DESC' -- Push returns into a table that can be returned from the function INSERT INTO @table EXEC sp_executesql @query RETURN END

没有,TVF无法返回未经类似的结果集。宣布表值功能的要点是,您可以知道结果表的结构并可以对其进行查询。 您可以使用其他代码或进程为您需要查询的每个输入表生成TVF,这将通过为每个表创建查询,并同时创建结构的确定性,从而为您提供结构的可变性.

我在EF迁移中使用这样的技术为每个表生成审核触发器。该代码是在一个地方定义和管理的,在SQL中,每个表都有一个实现。 如果您需要使用未构图的结果集,则应考虑存储过程,而不是功能。

sql sql-server
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.