从表为参数的函数中返回表计数

时间:2019-04-11 13:17:26

标签: sql sql-server tsql

我需要能够使用函数从各个表中获取计数。

这就是我现在拥有的:

IF EXISTS (
    SELECT * FROM sysobjects WHERE ID = OBJECT_ID(N'getTableCount')
    AND XTYPE IN (N'FN', N'IF', N'TF')
)
    DROP FUNCTION getTableCount
GO

CREATE FUNCTION getTableCount (@tableName VARCHAR(255))
RETURNS INT
AS
    BEGIN
        DECLARE @count INT;
        DECLARE @getCountQuery VARCHAR(255) = 'SELECT COUNT(*) FROM ' + @tableName;

        SET @count = EXEC @getCountQuery;

        RETURN @count;
    END

我知道这行不通。 RETURN的消息Incorrect syntax near the keyword 'EXEC'.呈红色波浪形

那我该怎么做到呢?

还可以在计算中使用该函数吗?

SELECT 2000 - dbo.getTableCount

这纯粹是一个示例,但表示我需要如何使用该功能。

1 个答案:

答案 0 :(得分:3)

如评论中所述,不可能按照您期望的方式进行。但是,有一种更有效的方法可以通过查询系统视图来实现。

CREATE FUNCTION getTableCount (@tableName VARCHAR(255))
RETURNS INT
AS
BEGIN

    RETURN (    SELECT SUM(row_count) tableCount
                FROM sys.dm_db_partition_stats p
                JOIN sys.tables t ON p.object_id = t.object_id
                WHERE index_id <= 1 --Just clustered index or heap
                AND t.name = PARSENAME( @tableName, 1)
                AND (t.schema_id = SCHEMA_ID(PARSENAME( @tableName, 2)) OR PARSENAME( @tableName, 2) IS NULL));
END

现在,如果我们在谈论有效的编码方法,我们可以简单地将其转换为一个内联表值函数,该函数将运行几倍。

CREATE FUNCTION getTableCount (@tableName VARCHAR(255))
RETURNS TABLE
AS
RETURN SELECT SUM(row_count) TableCount
        FROM sys.dm_db_partition_stats p
        JOIN sys.tables t ON p.object_id = t.object_id
        WHERE index_id <= 1 --Just clustered index or heap
        AND t.name = PARSENAME( @tableName, 1)
        AND (t.schema_id = SCHEMA_ID(PARSENAME( @tableName, 2)) OR PARSENAME( @tableName, 2) IS NULL);