powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос по t-sql
16 сообщений из 16, страница 1 из 1
вопрос по t-sql
    #39713891
michael_is_98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Подскажите, пожалуйста, ответ на вопрос.

Есть строка с наименованиями колонок таблицы tab, разделёнными запятой
Код: sql
1.
2.
declare @column_names varchar(100)
set @column_names = '''col1'',''col2'''


нужно определить, что все колонки, перечисленные в строке @column_names, существуют в таблице tab
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39713934
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос в INFORMATION_SCHEMA.
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39714505
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael_is_98,

Код: 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.
37.
/*
create table test_table1(col1 int, col2 int )
create table test_table2(col1 int, col2 int, col3 int )
create table test_table3(col1 int, col3 int )
*/

declare @column_names varchar(100)
set @column_names = '''col1'',''col2'''
---------------------------------------------------
IF EXISTS(
select replace(value,'''','') 
from string_split(@column_names,',')
except
select C.COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS C where C.TABLE_NAME=N'test_table1')
BEGIN

	RAISERROR('Не все колонки, перечисленные в строке @column_names %s, существуют в таблице tab %s', 10,1, @column_names, N'test_table1');
END

IF EXISTS(
select replace(value,'''','') 
from string_split(@column_names,',')
except
select C.COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS C where C.TABLE_NAME=N'test_table2'
)BEGIN

	RAISERROR('Не все колонки, перечисленные в строке @column_names %s, существуют в таблице tab %s', 10,1,  @column_names,N'test_table2');
END
IF EXISTS(
select replace(value,'''','') 
from string_split(@column_names,',')
except
select C.COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS C where C.TABLE_NAME=N'test_table3'
)BEGIN

	RAISERROR('Не все колонки, перечисленные в строке @column_names %s, существуют в таблице tab %s', 10,1, @column_names, N'test_table3');
END
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715161
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЗапрос в INFORMATION_SCHEMA.

А почему все упорно используют "INFORMATION_SCHEMA" и игнорируют "sys.columns" и "sys.tables"?
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715330
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeА почему все упорно используют "INFORMATION_SCHEMA"Вопрос задан не в тематическом разделе. Поэтому ответ даётся максимально общий, применимый к большинству RDBMS.
"sys.columns" и "sys.tables" - сущности, свойственные далеко не каждой DBMS, поддерживающей t-sql.

Модератор: Тема перенесена из форума "Вопрос-Ответ".
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715396
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeAkinaЗапрос в INFORMATION_SCHEMA.

А почему все упорно используют "INFORMATION_SCHEMA" и игнорируют "sys.columns" и "sys.tables"?INFORMATION_SCHEMA - стандарт. Будет работать не только в MSSQL
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715637
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap + Akina ,

Перечитайте пожалуйста название топика: " вопрос по t-sql " и ответьте на мой вопрос уже с этой позиции.

Это как если-бы джавист использовал какой-то метод только потому что его можно ещё использовать в бейсике, паскале и си.

Не хочу затевать срач, но ИМХО, применение системных таблиц гораздо удобнее и нагляднее чем INFORMATION_SCHEMA.

И я понимаю что есть люди которые свободно прыгают со скуля на оракл и майскуль и обратно, но их проблема обычно в том что они не знают и не могут учесть ньюансы среды.

Иногда, когда приходится бороться за производительность, натыкаешься на "универсальные" куски кода.
Когда их перепишешь, то начинает работать в десятки, а иногда сотни раз быстрее.
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715651
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для размышления:

Код: sql
1.
sp_helptext 'INFORMATION_SCHEMA.COLUMNS'
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715663
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeiap + Akina ,

Перечитайте пожалуйста название топика: " вопрос по t-sql " и ответьте на мой вопрос уже с этой позиции.

Это как если-бы джавист использовал какой-то метод только потому что его можно ещё использовать в бейсике, паскале и си.

Не хочу затевать срач, но ИМХО, применение системных таблиц гораздо удобнее и нагляднее чем INFORMATION_SCHEMA.

И я понимаю что есть люди которые свободно прыгают со скуля на оракл и майскуль и обратно, но их проблема обычно в том что они не знают и не могут учесть ньюансы среды.

Иногда, когда приходится бороться за производительность, натыкаешься на "универсальные" куски кода.
Когда их перепишешь, то начинает работать в десятки, а иногда сотни раз быстрее.Как писал Ицик Бен-Ган,"если есть две версии чего-либо и одно из них стандртное, я всегда буду пользоваться стандартным".
Как, например, COALESCE() вместо ISNULL().
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715667
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapКак, например, COALESCE() вместо ISNULL().Или CURRENT_TIMESTAMP вместо GETDATE()
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715814
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapКак писал Ицик Бен-Ган,"если есть две версии чего-либо и одно из них стандртное, я всегда буду пользоваться стандартным".
Как, например, COALESCE() вместо ISNULL().
Я конечно согласен с Ициком для общих случаев, но в данном контексте мы делаем это для чего?

Вижу только 2 обьяснения:
1. Специалист широкого профиля не заморачивается языковыми тонкостями и использует только "общепринятые" конструкции.
2. Предполагается что код может использоваться на разных платформах.

В обоих случаях мы попросту пренебрегаем производительностью.

Кстати, я пару лет назад тестировал. COALESCE - работает медленнее.
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39715866
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeiapКак писал Ицик Бен-Ган,"если есть две версии чего-либо и одно из них стандртное, я всегда буду пользоваться стандартным".
Как, например, COALESCE() вместо ISNULL().
Я конечно согласен с Ициком для общих случаев, но в данном контексте мы делаем это для чего?Для того, чтобы не переписывать код, который работает с метаданными, в тот следующий раз, когда MS придумает поменять свои системные представления? которые они как бы не обязаны не менять (в отличие от information_schema под стандартом). Даже если information_schema будет в два-пять-десять раз медленнее в тех или иных кейсах. Выгоднее писать портируемый в рамках одной платформы (чхать на все остальные) код и тюнить раз в десятилетку, если вдруг имеет место быть плохо, чем попадать на нерабочий код при миграции на новую версию.

SandalTreeКстати, я пару лет назад тестировал. COALESCE - работает медленнее.И? Выходит ли эта разница в скорости выполнения за предел погрешности на, скажем, 10 млрд записей на фоне поднятия этих записей с диска? В чем, вообще, прикол экономить на спичках?
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39716283
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичSandalTreeпропущено...

Я конечно согласен с Ициком для общих случаев, но в данном контексте мы делаем это для чего?Для того, чтобы не переписывать код, который работает с метаданными, в тот следующий раз, когда MS придумает поменять свои системные представления? которые они как бы не обязаны не менять (в отличие от information_schema под стандартом). Даже если information_schema будет в два-пять-десять раз медленнее в тех или иных кейсах. Выгоднее писать портируемый в рамках одной платформы (чхать на все остальные) код и тюнить раз в десятилетку, если вдруг имеет место быть плохо, чем попадать на нерабочий код при миграции на новую версию.

SandalTreeКстати, я пару лет назад тестировал. COALESCE - работает медленнее.И? Выходит ли эта разница в скорости выполнения за предел погрешности на, скажем, 10 млрд записей на фоне поднятия этих записей с диска? В чем, вообще, прикол экономить на спичках?
Программист не должен учитывать ВСЕ возможные варианты, а предположение что "MS придумает поменять свои системные представления" как раз из этой серии.

Таки вот пример высосаный из пальца, но он показывает как разница в скорости очень просто выходит за предел погрешности на, " скажем, 10 млрд записей на фоне поднятия этих записей с диска "
Код: sql
1.
2.
SELECT COALESCE( (SELECT COUNT(*) FROM TenBillionRecords), 0 );
SELECT IsNull( (SELECT COUNT(*) FROM TenBillionRecords), 0 );



Если лень тестировать, то сразу скажу что COALESCE просканирует таблицу 2 раза.
Это конечно не говорит что "она хуже", это пример того что возможны случаи, когда использование той или иной функции может влиять на производительность.
Там с ними всё гораздо сложнее. Я-б сравнил это с использовнием крестообразной и плоской отвёрток. Они делают то-же самое, но по разному и говорить что одна лучше другой просто бессмысленно.
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39716307
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeПрограммист не должен учитывать ВСЕ возможные варианты, а предположение что "MS придумает поменять свои системные представления" как раз из этой серии. Меняли при переходе с 2000 на 2005, так что не такая уж невероятная ситуация.
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39716535
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapSandalTreeпропущено...


А почему все упорно используют "INFORMATION_SCHEMA" и игнорируют "sys.columns" и "sys.tables"?INFORMATION_SCHEMA - стандарт. Будет работать не только в MSSQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
C:\ORACLE\INSTANT>sqlplus.exe SCOTT/TIGER

SQL*Plus: Release 11.2.0.1.0 Production on Fri Oct 12 12:40:09 2018

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production

SQL> select * from information_schema.columns;
select * from information_schema.columns
                                 *
ERROR at line 1:
ORA-00942: table or view does not exist
...
Рейтинг: 0 / 0
вопрос по t-sql
    #39716635
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныiapпропущено...
INFORMATION_SCHEMA - стандарт. Будет работать не только в MSSQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
C:\ORACLE\INSTANT>sqlplus.exe SCOTT/TIGER

SQL*Plus: Release 11.2.0.1.0 Production on Fri Oct 12 12:40:09 2018

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production

SQL> select * from information_schema.columns;
select * from information_schema.columns
                                 *
ERROR at line 1:
ORA-00942: table or view does not exist
Это говорит только о том, что Oracle плюёт на стандарты.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос по t-sql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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