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中,每个表都有一个实现。 如果您需要使用未构图的结果集,则应考虑存储过程,而不是功能。