powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / джойнить Int на varchar() .
10 сообщений из 10, страница 1 из 1
джойнить Int на varchar() .
    #39772316
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет Всем,
есть необходимость джойнить две таблицы по ключу в одной из которых 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
джойнить Int на varchar() .
    #39772322
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Репро увы предоставить не могу, но пару раз сталкивался с неверным выделением памяти при использовании ON ... VARCHAR(MAX) = FLOAT на 2016 RTM.
...
Рейтинг: 0 / 0
джойнить Int на varchar() .
    #39772325
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

а почему не TRY_CAST( as INT)?
...
Рейтинг: 0 / 0
джойнить Int на varchar() .
    #39772335
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал неправильно. Коррекция. 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
джойнить Int на varchar() .
    #39772439
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, насколько тормозной try_cast()?
...
Рейтинг: 0 / 0
джойнить Int на varchar() .
    #39772441
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовИнтересно, насколько тормозной try_cast()?
по сравнению с чем? sql всё равно не умеет сравнивать разные типы, имхо приводить принудительно к более короткому правильней
...
Рейтинг: 0 / 0
джойнить Int на varchar() .
    #39772449
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

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

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


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