Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Индекс по вычисляемому полю  [new]
Соискатель1
Guest
Подскажите пожалуйста почему COLUMNPROPERTY для поля созданного на основе приведенной ниже функции возвращает IsDeterministic = 1, а IsPrecise = 0 ???
Как следствие не могу создать по нему индекс .
create  function fn_GetAddrCode (
	@LocalityId numeric(3),
	@StreetId numeric(4), 
	@HouseNbr numeric(3), 
	@HouseLetter char(1)=null, 
	@HouseCampus numeric(2)=null,
	@FlatNbr numeric(3) = null,
	@FlatLetter char(1) = null)
returns char(20) with schemabinding
as
begin
	if @LocalityId is null or @LocalityId <= 0 return null
	if @StreetId is null or @StreetId <= 0 return null
	if @HouseNbr is null or @HouseNbr <= 0 return null 	
	
	if @HouseLetter is not null and patindex('[a-я]', @HouseLetter) = 0
		return null
	if @FlatLetter is not null
	   if @FlatNbr is null
	     	return null
	     else
	     if patindex('[a-я]', @HouseLetter) = 0
		   return null
 	
	declare @AddressCode char(20), @s_LocalityId varchar(3), @s_StreetId varchar(4)
	declare @s_HouseNbr varchar(3),@s_HouseCampus varchar(2), @s_FlatNbr varchar(3)
	
	set @s_LocalityId = ltrim(str(@LocalityId))
	set @s_StreetId = ltrim(str(@StreetId))
	set @s_HouseNbr = ltrim(str(@HouseNbr))
	set @s_HouseCampus = ltrim(str(@HouseCampus))

	set @AddressCode = replicate('0',3-len(@s_LocalityId)) + @s_LocalityId + '-'
	+ replicate('0',4-len(@s_StreetId)) + @s_StreetId + '-'
	+ replicate('0',3-len(@s_HouseNbr)) + @s_HouseNbr +
	+ isnull(upper(@HouseLetter), '0') + isnull(replicate('0',2-len(@s_HouseCampus))
		 + @s_HouseCampus, '00') + '-' +
	isnull(replicate('0',3-len(ltrim(str(@FlatNbr))))
		 + ltrim(str(@FlatNbr)), '000') + 
	isnull(upper(@FlatLetter), '0')
		
	return (@AddressCode)	
end

Спасибо.

ЗЫ. Set опции выставлены как положено.
17 фев 06, 15:03    [2368138]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по вычисляемому полю  [new]
Соискатель1
Guest
up
20 фев 06, 12:15    [2373230]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по вычисляемому полю  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
Фиг знает почему так происходит.

Если у вас SQL2005, сделайте вычисляемый столбец PERSISTED. Тогда сможете строить индекс
20 фев 06, 12:29    [2373330]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по вычисляемому полю  [new]
Соискатель1
Guest
нет, забыл сказать MS SQL 2000 sp3а
20 фев 06, 12:38    [2373395]     Ответить | Цитировать Сообщить модератору
 Re: Индекс по вычисляемому полю  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
вас кинула функция str. Никогда ей не пользуюсь, поэтому не догнал сразу.
при вызове str, аргумент сначала приводится к float, что сразу срубает precise

Пользуйтесь CAST везде где только возможно.
create  function fn_GetAddrCode (
	@LocalityId numeric(3),
	@StreetId numeric(4), 
	@HouseNbr numeric(3), 
	@HouseLetter char(1)=null, 
	@HouseCampus numeric(2)=null,
	@FlatNbr numeric(3) = null,
	@FlatLetter char(1) = null)
returns char(20) with schemabinding
as
begin

	if @LocalityId is null or @LocalityId <= 0 return null
	if @StreetId is null or @StreetId <= 0 return null
	if @HouseNbr is null or @HouseNbr <= 0 return null 	
	
	if @HouseLetter is not null and patindex('[a-я]', @HouseLetter) = 0
		return null
	if @FlatLetter is not null
	   if @FlatNbr is null
	     	return null
	     else
	     if patindex('[a-я]', @HouseLetter) = 0
		   return null
 	
	declare @AddressCode char(20), @s_LocalityId varchar(3), @s_StreetId varchar(4)
	declare @s_HouseNbr varchar(3),@s_HouseCampus varchar(2), @s_FlatNbr varchar(3)
	
	set @s_LocalityId = ltrim(CAST(@LocalityId as varchar(255)))
	set @s_StreetId = ltrim(CAST(@StreetId as varchar(255)))
	set @s_HouseNbr = ltrim(CAST(@HouseNbr as varchar(255)))
	set @s_HouseCampus = ltrim(CAST(@HouseCampus as varchar(255)))

	set @AddressCode = replicate('0',3-len(@s_LocalityId)) + @s_LocalityId + '-'
	+ replicate('0',4-len(@s_StreetId)) + @s_StreetId + '-'
	+ replicate('0',3-len(@s_HouseNbr)) + @s_HouseNbr +
	+ isnull(upper(@HouseLetter), '0') + isnull(replicate('0',2-len(@s_HouseCampus))
		 + @s_HouseCampus, '00') + '-' +
	isnull(replicate('0',3-len(ltrim(CAST(@FlatNbr as varchar(255)))))
		 + ltrim(CAST(@FlatNbr as varchar(255))), '000') + 
	isnull(upper(@FlatLetter), '0')
		
	return (@AddressCode)	
end
21 фев 06, 10:56    [2376979]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить