2015-02-24 111 views
1

我创建了一个实现的COUNT(*)操作的更快的替代方案SQL函数:行数函数总是返回NULL

create function fast_row_count (@table_name varchar) 
returns bigint 
as 
begin 
declare @row_count int; 
set @row_count = 
(select sum(row_count) from sys.dm_db_partition_stats with (nolock) where object_id = object_id(@table_name)); 
return @row_count 
end 
go 

执行时,它总是返回NULL值。

select dbo.fast_row_count('tbl_calls') 

然而,作为一个单独的批次中的硬编码值执行时,它工作正常:

declare @row_count int; 
    set @row_count = 
    (select sum(row_count) from sys.dm_db_partition_stats with (nolock) where object_id = object_id('tbl_calls')); 
    print @row_count 
+8

'varchar'没有长度?这是一个禁忌。尝试'SYSNAME'。 – 2015-02-24 09:31:41

+2

'varchar'没有长度就是'varchar(1)'。你的表名可能不适合一个字符,是吗? – Luaan 2015-02-24 09:32:38

+2

[不良习惯踢:声明VARCHAR没有(长度)](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length .aspx) – GarethD 2015-02-24 09:36:11

回答

2
create function fast_row_count (@table_name varchar (max)) 

因您定义varchar,而不是界定其lenght所以它给空

varchar [(n | max)]

可变长度,非Unicode字符串数据。 n定义字符串的长度,可以是从1到8,000的值。 max表示最大存储大小为2^31-1字节(2 GB)。存储大小是输入数据的实际长度+ 2个字节。 varchar的ISO同义词是char变量或字符变量。

备注

当在数据定义或变量声明声明不指定n,则默认长度为1.当使用CAST和CONVERT函数时没有指定n,则默认长度为30

以获取更多信息

https://msdn.microsoft.com/en-IN/library/ms176089.aspx