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

Откуда: Москва
Сообщений: 3825
Привет Всем,
есть необходимость джойнить две таблицы по ключу в одной из которых Int, в другой varchar() .

Если сейчас на 2016 разница, как соединять?

ON T1.NS = T2.N
ON CAST(T1.NS AS VARCHAR(MAX))= T2.N
ON CAST(T1.NS AS VARCHAR(10))= T2.N

Планы показывают одно и тоже.

IF OBJECT_ID('tempdb..#T1') IS NOT NULL 
	DROP TABLE #T1;

WITH D AS (SELECT TOP 1000 number FROM master..spt_values)
SELECT NEWID() AS DATA1, NS = CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS VARCHAR(10))
INTO #T1
FROM D AS D1, D AS D2;
GO
ALTER TABLE #T1 ALTER COLUMN NS VARCHAR(10) NOT NULL; 
GO
ALTER TABLE #T1 ADD PRIMARY KEY CLUSTERED (NS) ;
GO
IF OBJECT_ID('tempdb..#T2') IS NOT NULL 
	DROP TABLE #T2;

WITH D AS (SELECT TOP 1000 number FROM master..spt_values)
SELECT NEWID() AS DATA1, N = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
INTO #T2
FROM D AS D1, D AS D2
;
GO
ALTER TABLE #T2 ALTER COLUMN N INT NOT NULL; 
GO
ALTER TABLE #T2 ADD PRIMARY KEY CLUSTERED (N) ;
GO
SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON T1.NS = T2.N

SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON CAST(T1.NS AS VARCHAR(MAX))= T2.N

SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON CAST(T1.NS AS VARCHAR(10))= T2.N
11 фев 19, 15:37    [21806546]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 994
Репро увы предоставить не могу, но пару раз сталкивался с неверным выделением памяти при использовании ON ... VARCHAR(MAX) = FLOAT на 2016 RTM.
11 фев 19, 15:42    [21806552]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5891
a_voronin,

а почему не TRY_CAST( as INT)?
11 фев 19, 15:43    [21806557]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3825
Написал неправильно. Коррекция. TRY_CAST работает неплохо

IF OBJECT_ID('tempdb..#T1') IS NOT NULL 
	DROP TABLE #T1;

WITH D AS (SELECT TOP 1000 number FROM master..spt_values)
SELECT NEWID() AS DATA1, NS = CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS VARCHAR(10))
INTO #T1
FROM D AS D1, D AS D2;
GO
ALTER TABLE #T1 ALTER COLUMN NS VARCHAR(10) NOT NULL; 
GO
ALTER TABLE #T1 ADD PRIMARY KEY CLUSTERED (NS) ;
GO
IF OBJECT_ID('tempdb..#T2') IS NOT NULL 
	DROP TABLE #T2;

WITH D AS (SELECT TOP 1000 number FROM master..spt_values)
SELECT NEWID() AS DATA1, N = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
INTO #T2
FROM D AS D1, D AS D2
;
GO
ALTER TABLE #T2 ALTER COLUMN N INT NOT NULL; 
GO
ALTER TABLE #T2 ADD PRIMARY KEY CLUSTERED (N) ;
GO
SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON T2.N = T1.NS

SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON CAST(T2.N AS VARCHAR(MAX))= T1.NS

SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON CAST(T2.N AS VARCHAR(10))= T1.NS

SELECT COUNT(*) FROM #T1 T1 
INNER JOIN #T2 T2 ON T2.N = TRY_CAST(T1.NS AS INT)
11 фев 19, 15:55    [21806569]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6188
Интересно, насколько тормозной try_cast()?
11 фев 19, 17:45    [21806720]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5891
Владислав Колосов
Интересно, насколько тормозной try_cast()?

по сравнению с чем? sql всё равно не умеет сравнивать разные типы, имхо приводить принудительно к более короткому правильней
11 фев 19, 17:47    [21806722]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6188
TaPaK,

например, если все ОК и ошибок неявного преобразования нет. В случае двух больших таблиц сравниваем хэш-суммы. Если в этот процесс добавить try_cast(), насколько это замедлит выполнение по тому же сценарию? Может кто-то проводил опыты?
11 фев 19, 17:57    [21806734]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
invm
Member

Откуда: Москва
Сообщений: 8379
Владислав Колосов
Интересно, насколько тормозной try_cast()?
Тормознутость/нетормознутость try_cast() тут ни при чем.
Подумайте, что затратнее: кастить целое в строку и считать хеши строк или кастить строку в целое и хеши не считать, ибо целое само себе хеш (если not null)?
11 фев 19, 19:06    [21806814]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2365
invm
Владислав Колосов
Интересно, насколько тормозной try_cast()?
Тормознутость/нетормознутость try_cast() тут ни при чем.
Подумайте, что затратнее: кастить целое в строку и считать хеши строк или кастить строку в целое и хеши не считать, ибо целое само себе хеш (если not null)?


В сулчае "строку в целое" может обломаться
12 фев 19, 12:01    [21807214]     Ответить | Цитировать Сообщить модератору
 Re: джойнить Int на varchar() .  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3526
а потом для оптимизации решит дба добавить индекс....
12 фев 19, 15:41    [21807550]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить