Возвращает количество таблиц из функции, в которой таблица является параметром - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужно иметь возможность получить счет из разных таблиц с помощью функции.

Вот что у меня сейчас есть:

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 Ответ

3 голосов
/ 11 апреля 2019

Как уже упоминалось в комментариях, это невозможно сделать так, как вы ожидаете.Однако есть более эффективный способ добиться этого путем запроса системных представлений.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...