Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / джойнить Int на varchar() . / 10 сообщений из 10, страница 1 из 1
11.02.2019, 15:37
    #39772316
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
Привет Всем,
есть необходимость джойнить две таблицы по ключу в одной из которых 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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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
...
Рейтинг: 0 / 0
11.02.2019, 15:42
    #39772322
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
Репро увы предоставить не могу, но пару раз сталкивался с неверным выделением памяти при использовании ON ... VARCHAR(MAX) = FLOAT на 2016 RTM.
...
Рейтинг: 0 / 0
11.02.2019, 15:43
    #39772325
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
a_voronin,

а почему не TRY_CAST( as INT)?
...
Рейтинг: 0 / 0
11.02.2019, 15:55
    #39772335
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
Написал неправильно. Коррекция. TRY_CAST работает неплохо

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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)
...
Рейтинг: 0 / 0
11.02.2019, 17:45
    #39772439
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
Интересно, насколько тормозной try_cast()?
...
Рейтинг: 0 / 0
11.02.2019, 17:47
    #39772441
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
Владислав КолосовИнтересно, насколько тормозной try_cast()?
по сравнению с чем? sql всё равно не умеет сравнивать разные типы, имхо приводить принудительно к более короткому правильней
...
Рейтинг: 0 / 0
11.02.2019, 17:57
    #39772449
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
TaPaK,

например, если все ОК и ошибок неявного преобразования нет. В случае двух больших таблиц сравниваем хэш-суммы. Если в этот процесс добавить try_cast(), насколько это замедлит выполнение по тому же сценарию? Может кто-то проводил опыты?
...
Рейтинг: 0 / 0
11.02.2019, 19:06
    #39772494
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
Владислав КолосовИнтересно, насколько тормозной try_cast()?Тормознутость/нетормознутость try_cast() тут ни при чем.
Подумайте, что затратнее: кастить целое в строку и считать хеши строк или кастить строку в целое и хеши не считать, ибо целое само себе хеш (если not null)?
...
Рейтинг: 0 / 0
12.02.2019, 12:01
    #39772716
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
invmВладислав КолосовИнтересно, насколько тормозной try_cast()?Тормознутость/нетормознутость try_cast() тут ни при чем.
Подумайте, что затратнее: кастить целое в строку и считать хеши строк или кастить строку в целое и хеши не считать, ибо целое само себе хеш (если not null)?

В сулчае "строку в целое" может обломаться
...
Рейтинг: 0 / 0
12.02.2019, 15:41
    #39772914
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
джойнить Int на varchar() .
а потом для оптимизации решит дба добавить индекс....
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / джойнить Int на varchar() . / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]