我需要能够使用函数从各个表中获取计数。
这就是我现在拥有的:
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
这纯粹是一个示例,但表示我需要如何使用该功能。
答案 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);