Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как заставить CHECKSUM работать таким образом?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetHash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
	DROP FUNCTION [dbo].[GetHash]
GO
CREATE  FUNCTION [dbo].[GetHash] 
(
	@string nvarchar(1000)
)
RETURNS int  AS  
BEGIN 
declare @n int
SET @n = CHECKSUM(@string  collate database_default)
return @n
END
GO
GRANT EXECUTE on [dbo].[GetHash] to public;
GO

if NOT(object_id('tempdb..#t')   IS NULL)			drop table #t
create table #t(id int identity, string nvarchar(1000), hsh int null)

insert into #t(string) values (N'my string 1')
insert into #t(string) values (N'newyork')
insert into #t(string) values (N'abrakadabra')

select CHECKSUM(string) as 'hash',[dbo].[GetHash](string collate database_default) as 'gethash', * from #t

Имеем:

hash        gethash     id          string        hsh
----------- ----------- ----------- ------------- ------
822403903   1129312134  1           my string 1    NULL
2044198074  1746991179  2           newyork        NULL
837393099   2104627733  3           abrakadabra    NULL

(3 row(s) affected)

а если так, то считает правильно:

select CHECKSUM(string  collate database_default) as 'hash',[dbo].[GetHash](string collate database_default) as 'gethash', * from #t

hash        gethash     id          string                  hsh
----------- ----------- ----------- ------------ -----------
1129312134  1129312134  1           my string 1    NULL
1746991179  1746991179  2           newyork        NULL
2104627733  2104627733  3           abrakadabra   NULL

(3 row(s) affected)


в связи с этим вопрос: а что - никак нельзя свою функцию заставить считать чексумму с учетом коллейта?
2 июл 09, 12:36    [7367748]     Ответить | Цитировать Сообщить модератору
 Re: как заставить CHECKSUM работать таким образом?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Спробуйте так:
create table #t(id int identity, string nvarchar(1000) collate database_default, hsh int null)
2 июл 09, 14:06    [7368381]     Ответить | Цитировать Сообщить модератору
 Re: как заставить CHECKSUM работать таким образом?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
tpg
Спробуйте так:
create table #t(id int identity, string nvarchar(1000) collate database_default, hsh int null)


(Y)
2 июл 09, 14:46    [7368692]     Ответить | Цитировать Сообщить модератору
 Re: как заставить CHECKSUM работать таким образом?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
кстати, а если вместо временнйо табицы использовать таблицу-переменную надо ли объявлять
так же коллейт?
2 июл 09, 16:23    [7369563]     Ответить | Цитировать Сообщить модератору
 Re: как заставить CHECKSUM работать таким образом?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Winnipuh
кстати, а если вместо временнйо табицы использовать таблицу-переменную надо ли объявлять
так же коллейт?
У меня получился дефолтовый COLLATE текущей базы (а не tempdb).
Получается, не надо COLLATE DATABASE_DEFAULT писать...
2 июл 09, 17:23    [7369987]     Ответить | Цитировать Сообщить модератору
 Re: как заставить CHECKSUM работать таким образом?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
Winnipuh
кстати, а если вместо временнйо табицы использовать таблицу-переменную надо ли объявлять
так же коллейт?
У меня получился дефолтовый COLLATE текущей базы (а не tempdb).
Получается, не надо COLLATE DATABASE_DEFAULT писать...


а если сервер разместит её в темпдб можно быть уверенным?
2 июл 09, 17:39    [7370118]     Ответить | Цитировать Сообщить модератору
 Re: как заставить CHECKSUM работать таким образом?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Winnipuh
iap
Winnipuh
кстати, а если вместо временнйо табицы использовать таблицу-переменную надо ли объявлять
так же коллейт?
У меня получился дефолтовый COLLATE текущей базы (а не tempdb).
Получается, не надо COLLATE DATABASE_DEFAULT писать...


а если сервер разместит её в темпдб можно быть уверенным?
Сервер и так её в tempdb "размещает".
3 июл 09, 06:56    [7371365]     Ответить | Цитировать Сообщить модератору
 Re: как заставить CHECKSUM работать таким образом?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
tpg
Winnipuh
iap
Winnipuh
кстати, а если вместо временнйо табицы использовать таблицу-переменную надо ли объявлять
так же коллейт?
У меня получился дефолтовый COLLATE текущей базы (а не tempdb).
Получается, не надо COLLATE DATABASE_DEFAULT писать...


а если сервер разместит её в темпдб можно быть уверенным?
Сервер и так её в tempdb "размещает".


а как же мифы о том, что иногда такие таблицы размещаются в памяти?....
3 июл 09, 12:27    [7372792]     Ответить | Цитировать Сообщить модератору
 Re: как заставить CHECKSUM работать таким образом?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Winnipuh
а как же мифы о том, что иногда такие таблицы размещаются в памяти?....
Мифом как раз и является "жизнь табличной переменной только в памяти".
3 июл 09, 14:29    [7373717]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить