2015-02-24 109 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