我可以在SQL Server上创建动态表值函数吗?

时间:2019-07-17 15:41:05

标签: sql sql-server function tsql dynamic

我正在尝试用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

1 个答案:

答案 0 :(得分:4)


这是SQL Server中的明确限制。存储过程可以更改表数据,而user-defined functions不能。

尽管动态SQL不需要更改表数据,但它确实需要存储过程调用。由于存储过程将允许更改数据,因此不能在表值函数中使用它。

使用存储过程可以解决您的问题。