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

Откуда:
Сообщений: 242
Добрый день.

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

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

нужно определить, что все колонки, перечисленные в строке @column_names, существуют в таблице tab
6 окт 18, 14:23    [21697005]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20487
Запрос в INFORMATION_SCHEMA.
6 окт 18, 20:42    [21697120]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
iiyama
Member

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

/*
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
8 окт 18, 15:59    [21698282]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28141
Akina
Запрос в INFORMATION_SCHEMA.


А почему все упорно используют "INFORMATION_SCHEMA" и игнорируют "sys.columns" и "sys.tables"?
9 окт 18, 21:03    [21699730]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20487
SandalTree
А почему все упорно используют "INFORMATION_SCHEMA"
Вопрос задан не в тематическом разделе. Поэтому ответ даётся максимально общий, применимый к большинству RDBMS.
"sys.columns" и "sys.tables" - сущности, свойственные далеко не каждой DBMS, поддерживающей t-sql.

Модератор: Тема перенесена из форума "Вопрос-Ответ".


Сообщение было отредактировано: 10 окт 18, 08:12
10 окт 18, 07:23    [21700014]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SandalTree
Akina
Запрос в INFORMATION_SCHEMA.


А почему все упорно используют "INFORMATION_SCHEMA" и игнорируют "sys.columns" и "sys.tables"?
INFORMATION_SCHEMA - стандарт. Будет работать не только в MSSQL
10 окт 18, 09:51    [21700110]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28141
iap + Akina ,

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

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

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

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

Иногда, когда приходится бороться за производительность, натыкаешься на "универсальные" куски кода.
Когда их перепишешь, то начинает работать в десятки, а иногда сотни раз быстрее.
10 окт 18, 16:14    [21700696]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36902
Для размышления:

sp_helptext 'INFORMATION_SCHEMA.COLUMNS'
10 окт 18, 16:31    [21700731]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SandalTree
iap + Akina ,

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

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

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

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

Иногда, когда приходится бороться за производительность, натыкаешься на "универсальные" куски кода.
Когда их перепишешь, то начинает работать в десятки, а иногда сотни раз быстрее.
Как писал Ицик Бен-Ган,"если есть две версии чего-либо и одно из них стандртное, я всегда буду пользоваться стандартным".
Как, например, COALESCE() вместо ISNULL().
10 окт 18, 16:58    [21700767]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Как, например, COALESCE() вместо ISNULL().
Или CURRENT_TIMESTAMP вместо GETDATE()
10 окт 18, 17:01    [21700774]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28141
iap
Как писал Ицик Бен-Ган,"если есть две версии чего-либо и одно из них стандртное, я всегда буду пользоваться стандартным".
Как, например, COALESCE() вместо ISNULL().

Я конечно согласен с Ициком для общих случаев, но в данном контексте мы делаем это для чего?

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

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

Кстати, я пару лет назад тестировал. COALESCE - работает медленнее.
10 окт 18, 21:53    [21701038]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36902
SandalTree
iap
Как писал Ицик Бен-Ган,"если есть две версии чего-либо и одно из них стандртное, я всегда буду пользоваться стандартным".
Как, например, COALESCE() вместо ISNULL().

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

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

Сообщение было отредактировано: 11 окт 18, 00:52
11 окт 18, 00:42    [21701115]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28141
Гавриленко Сергей Алексеевич
SandalTree
пропущено...

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

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

Программист не должен учитывать ВСЕ возможные варианты, а предположение что "MS придумает поменять свои системные представления" как раз из этой серии.

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


Если лень тестировать, то сразу скажу что COALESCE просканирует таблицу 2 раза.
Это конечно не говорит что "она хуже", это пример того что возможны случаи, когда использование той или иной функции может влиять на производительность.
Там с ними всё гораздо сложнее. Я-б сравнил это с использовнием крестообразной и плоской отвёрток. Они делают то-же самое, но по разному и говорить что одна лучше другой просто бессмысленно.
11 окт 18, 17:09    [21701824]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36902
SandalTree
Программист не должен учитывать ВСЕ возможные варианты, а предположение что "MS придумает поменять свои системные представления" как раз из этой серии.
Меняли при переходе с 2000 на 2005, так что не такая уж невероятная ситуация.
11 окт 18, 17:35    [21701860]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5920
iap
SandalTree
пропущено...


А почему все упорно используют "INFORMATION_SCHEMA" и игнорируют "sys.columns" и "sys.tables"?
INFORMATION_SCHEMA - стандарт. Будет работать не только в MSSQL

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
12 окт 18, 10:44    [21702259]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по t-sql  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Сон Веры Павловны
iap
пропущено...
INFORMATION_SCHEMA - стандарт. Будет работать не только в MSSQL

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 плюёт на стандарты.
12 окт 18, 13:07    [21702428]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить