2015-02-24 3 views
1

Я создал функцию SQL, которая реализует более быстрой альтернативой COUNT(*) операции:Строка Функция подсчета всегда возвращает 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'. –

+2

'varchar' без длины - это просто' varchar (1) '. Возможно, имя вашей таблицы не соответствует одному символу, не так ли? – Luaan

+2

[Плохие привычки пинать: объявление VARCHAR без (длина)] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length .aspx) – GarethD

ответ

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

из-за вы определяете VARCHAR и не определяет его длину так, его предоставление нулевой

VARCHAR [(п | макс)]

Строковые данные переменной длины, не относящиеся к Юникоду. n определяет длину строки и может быть значением от 1 до 8000. max указывает, что максимальный размер хранилища составляет 2^31-1 байта (2 ГБ). Размер хранилища - это фактическая длина введенных данных + 2 байта. Синонимы ISO для varchar имеют различный характер или характер.

Замечания

При п не указана в определении данных или инструкции объявления переменной, длина по умолчанию 1. При п не указана при использовании CAST и CONVERT функции, по умолчанию длина 30.

для получения дополнительной информации

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

Смежные вопросы