我正在尝试用SQL编写一个函数,该函数应返回一个表,该表是模式中所有表的并集。在SQL Server中可以这样做吗?
我经常需要在模式中连接表,为此,我从这里找到了一个非常不错的动态查询:
How to SELECT and UNION from a group of Tables in the schema in SQL Server 2008 R2
(MarkD的答案)
现在,由于我需要针对不同的模式重复执行此操作。我正在考虑编写一个函数,该函数将表名作为表名输入架构名称和通配符,并输出所有表的并集。
但是,我担心在构造create函数时可能需要声明表列-我不能做,因为该表应该是动态的!
我对SQL函数并不完全熟悉,希望我能像在Python中那样做。这可能吗?
CREATE FUNCTION udfJoinTablesinSchema
(@Schemaname VARCHAR(100),
@TableNameWildcard VARCHAR(100))
RETURNS TABLE
AS
RETURN
(DECLARE @SelectClause VARCHAR(100) = 'SELECT *',
@Query NVARCHAR(MAX) = ''
SELECT @Query = @Query + @SelectClause + ' FROM ' + TABLE_SCHEMA+'.['+TABLE_NAME + '] UNION ALL '
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME like @TableNameWildcard
AND TABLE_SCHEMA = @Schemaname
SELECT @Query = LEFT(@Query, LEN(@Query) - LEN(' UNION ALL '))
PRINT(@Query)
EXEC(@Query)
);
我收到一条错误消息:
“ DECLARE”附近的语法不正确。当我将鼠标悬停在DECLARE上时,期望为'(',SELECT或WITH。”。
它也抱怨两个标量变量@TableNameWildCard
,@Schemaname
。
答案 0 :(得分:4)
这是SQL Server中的明确限制。存储过程可以更改表数据,而user-defined functions不能。
尽管动态SQL不需要更改表数据,但它确实需要存储过程调用。由于存储过程将允许更改数据,因此不能在表值函数中使用它。
使用存储过程可以解决您的问题。