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

Откуда: Ивано-Франковск-Киев
Сообщений: 467
Как получить список столбцов таблицы кроме вычисляемых?

Запрос :

select * from INFORMATION_SCHEMA.columns
where TABLE_NAME=N'LstAnaliz'

выдает все столбцы, а как отбросить вычисляемые?
23 май 05, 14:12    [1564329]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Довесить условие
COLUMNPROPERTY ( id , column , 'IsComputed' )
23 май 05, 14:20    [1564377]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Vladimir Kovalevskii
Member

Откуда:
Сообщений: 696
sp_columns 'TABLE_NAME'

sp_help 'TABLE_NAME'

SELECT * FROM syscolumns sc
 JOIN sysobjects so ON sc.id = so.id
WHERE so.Name = 'TABLE_NAME'
23 май 05, 14:48    [1564529]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
2Vladimir Kovalevskii: вы бы хоть прочитали пост автора, а не только заголовок топика.
23 май 05, 15:02    [1564587]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Vladimir Kovalevskii
Member

Откуда:
Сообщений: 696
точно. не прочитал.

но даже если мы работаем с Views, что мешает нам использовать sys_columns, sys_objects?

вот что не понятно.
23 май 05, 15:23    [1564676]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Не sys_columns, sys_objects, а syscolumns и sysobjects. Это первое.

А второе - зачем. Ответ, как всегда, в BOL:
BOL
Information Schema Views
Microsoft® SQL Server™ 2000 provides two methods for obtaining meta data: system stored procedures or information schema views.

Note To obtain meta data, use system stored procedures, system functions, or these system-supplied views only. Querying the system tables directly may not provide accurate information if system tables are changed in future releases.

These views provide an internal, system table-independent view of the SQL Server meta data. Information schema views allow applications to work properly even though significant changes have been made to the system tables. The information schema views included in SQL Server conform to the SQL-92 Standard definition for the INFORMATION_SCHEMA.

SQL Server supports a three-part naming convention when referring to the current server. The SQL-92 standard also supports a three-part naming convention. However, the names used in both naming conventions are different. These views are defined in a special schema named INFORMATION_SCHEMA, which is contained in each database. Each INFORMATION_SCHEMA view contains meta data for all data objects stored in that particular database. This table describes the relationships between the SQL Server names and the SQL-92-standard names.

This naming convention mapping applies to these SQL Server SQL-92-compatible views. These views are defined in a special schema named INFORMATION_SCHEMA, which is contained in each database. Each INFORMATION_SCHEMA view contains meta data for all data objects stored in that particular database.
23 май 05, 16:29    [1564952]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Vladimir Kovalevskii
Member

Откуда:
Сообщений: 696
BOL

Note To obtain meta data, use system stored procedures, system functions, or these system-supplied views only. Querying the system tables directly may not provide accurate information if system tables are changed in future releases.



замечательно чем плохи
sp_* ? (sp - system procedure)

а то что в них происходит Direct Query To the System Tables. лан херня.

INFORMATION_SCHEMA - отличная и удобная абстракция (а именно таблица) рекоммендованная к использованию разработчиками для соотв. станд SQL-92, применительно к представлениям. и работая с представлениями надо использовать именно её.

но кто сказал, что нельзя и по-другому?
23 май 05, 17:27    [1565249]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
Извиняюсь за OFFTOPIC если конечно можно это считать таковым.

2 GreenSunrise
Естественно, совместимость с будущими версиями очень полезная вещь, но а как быть со скоростю. Использование системных таблиц для получения метаданных дает выгрыш в скорости напорядок выше по сравнению с информационными схеммами, так как они очень обшие.
Хотелось бы обсудить эту тему.
23 май 05, 17:53    [1565376]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
дает выгрыш в скорости напорядок выше по сравнению с информационными схеммами, так как они очень обшие.
Про "на порядок" вы так сказали или тестировали ?
23 май 05, 17:59    [1565406]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Vladimir Kovalevskii
замечательно чем плохи
sp_* ? (sp - system procedure)

а то что в них происходит Direct Query To the System Tables. лан херня.

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

Vladimir Kovalevskii
INFORMATION_SCHEMA - отличная и удобная абстракция (а именно таблица)

А именно схема

Vladimir Kovalevskii
рекоммендованная к использованию разработчиками для соотв. станд SQL-92

В чем и состоит ее бонус. Соответствие стандарту. Стандарт - это черный ящик. Определяется, что должно быть на входе, что на выходе. Каким образом разработчики этого добьются - их дело. Именно поэтому более правильно (не единственно правильно, а более) использовать вещи, соответствующие стандарту, а не обращение напрямую к системным таблицам, как в вашем примере.

Ну и напоследок. Мой пост https://www.sql.ru/forum/actualpost.aspx?bid=1&tid=186277&mid=0&p=1#1564587 относился не к тому, что вы что-то неправильно сказали, а только к тому, что автор спрашивал про то, как отсечь вычисляемые колонки. В то время как ваш ответ был исключительно на вопрос "Как получить список столбцов таблицы". Разве что sp_help могла стать ответом на вопрос, потому как в возвращаемом ею рекордсете есть столбец Computed.
23 май 05, 18:04    [1565426]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
2 Gory
Тестировал. Но придется верить на слово, так как пример я не приведу ;-)
23 май 05, 18:08    [1565439]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Hamlet
Извиняюсь за OFFTOPIC если конечно можно это считать таковым.

2 GreenSunrise
Естественно, совместимость с будущими версиями очень полезная вещь, но а как быть со скоростю. Использование системных таблиц для получения метаданных дает выгрыш в скорости напорядок выше по сравнению с информационными схеммами, так как они очень обшие.
Хотелось бы обсудить эту тему.

Приведите результаты тестов и мы с удовольствием ее обсудим. "На порядок" - весьма серьезное заявление. Вы готовы подтвердить его?

В конце концов, эти вьюхи - обычные вьюхи, чей код можно посмотреть и чей план выполнения тоже. Скорее всего, если вам надо будет сделать сложный запрос к нескольким вьюхам из INFORMATION_SCHEMA, впихнуть туда кучу джойнов и условий, то да, наверное, проигрыш в скорости будет. И в ситуации, когда я увижу непозволительную потерю производительности для моей конкретной задачи, я откажусь от этих вьюх в пользу прямого обращения к системным таблицам. Но для такого решения я проведу серьезные тесты и приведу конкретные результаты.
23 май 05, 18:10    [1565448]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Hamlet
2 Gory
Тестировал. Но придется верить на слово, так как пример я не приведу ;-)

Извините, не знаю, как Glory, а я предпочту не верить до получения результатов. Вот с ними - пожалуйста. Особенно, если у меня воспроизведется такая потеря.
23 май 05, 18:11    [1565455]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Hamlet
2 Gory
Тестировал. Но придется верить на слово, так как пример я не приведу ;-)

На порядок - это как минимум в 10 раз. Для таких заявления одного честного слова маловато.
Хотя можно разумеется построить более простой запрос, чем использован а INFORMATION_SCHEMA
23 май 05, 18:17    [1565479]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
SELECT T.TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS T JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE C ON T.TABLE_NAME = C.TABLE_NAME and T.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'


 select
	t_obj.name	as TABLE_NAME
	,col.name	as COLUMN_NAME
	,v.number	as ORDINAL_POSITION
from sysobjects	t_obj 
	JOIN sysobjects	c_obj
		ON t_obj.id	= c_obj.parent_obj
	JOIN syscolumns	col
		ON t_obj.id	= col.id
	JOIN sysindexes i
		ON t_obj.id	= i.id
	JOIN master.dbo.spt_values v
		ON v.number 	<= i.keycnt
			and c_obj.name  = i.name
			and col.name	= index_col(t_obj.name,i.indid,v.number)
where c_obj.xtype	='PK'
	and t_obj.xtype  = 'U'
	and v.number 	> 0 
 	and v.type 	= 'P'



Query 1: Query cost (relative to the batch): 77.20%

Query 2: Query cost (relative to the batch): 22.80%
23 май 05, 19:07    [1565625]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
declare @start datetime

set @start = getdate()
SELECT T.TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS T JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE C ON T.TABLE_NAME = C.TABLE_NAME and T.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
select datediff(ms, @start, getdate())


set @start = getdate()
 select
	t_obj.name	as TABLE_NAME
	,col.name	as COLUMN_NAME
	,v.number	as ORDINAL_POSITION
from sysobjects	t_obj 
	JOIN sysobjects	c_obj
		ON t_obj.id	= c_obj.parent_obj
	JOIN syscolumns	col
		ON t_obj.id	= col.id
	JOIN sysindexes i
		ON t_obj.id	= i.id
	JOIN master.dbo.spt_values v
		ON v.number 	<= i.keycnt
			and c_obj.name  = i.name
			and col.name	= index_col(t_obj.name,i.indid,v.number)
where c_obj.xtype	='PK'
	and t_obj.xtype  = 'U'
	and v.number 	> 0 
 	and v.type 	= 'P'
select datediff(ms, @start, getdate())

1ый запрос 66 - 146 ms(min/max)
2ой запрос 33-50ms(min/max)

Где обещанный на порядок ?
23 май 05, 19:28    [1565683]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
по logical reads-ам тоже 884 на 473
23 май 05, 19:45    [1565719]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
А если так

declare @start datetime

set @start = getdate()
SELECT T.TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS T JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE C ON T.TABLE_NAME = C.TABLE_NAME and T.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
select datediff(ms, @start, getdate())


set @start = getdate()
 select
	t_obj.name	as TABLE_NAME
	,col.name	as COLUMN_NAME

from sysobjects	t_obj 
	JOIN sysobjects	c_obj
		ON t_obj.id	= c_obj.parent_obj
	JOIN syscolumns	col
		ON t_obj.id	= col.id
	JOIN sysindexes i
		ON t_obj.id	= i.id
where c_obj.xtype	='PK'
	and t_obj.xtype  = 'U'
select datediff(ms, @start, getdate())

У меня нет составных ключей ;-))
23 май 05, 21:17    [1565821]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Hamlet
Member

Откуда: Armenia
Сообщений: 573
Пардон, опечатка (спешу домой однако).

declare @start datetime

set @start = getdate()
SELECT DISTINCT T.TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS T JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE C ON T.TABLE_NAME = C.TABLE_NAME and T.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
select datediff(ms, @start, getdate())


set @start = getdate()
 select
	t_obj.name	as TABLE_NAME
	,col.name	as COLUMN_NAME
from sysobjects	t_obj 
	JOIN sysobjects	c_obj
		ON t_obj.id	= c_obj.parent_obj
	JOIN syscolumns	col
		ON t_obj.id	= col.id
	JOIN sysindexes i
		ON t_obj.id	= i.id
			and c_obj.name  = i.name
			and col.name	= index_col(t_obj.name,i.indid,1)
where c_obj.xtype	='PK'
	and t_obj.xtype  = 'U'
select datediff(ms, @start, getdate())
23 май 05, 21:22    [1565825]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Vladimir Kovalevskii
Member

Откуда:
Сообщений: 696
!!!!!!! читем внимательно BOL все вместе !!!!!!!!!

и насчёт системных процедур.
1. Их КОД ОТКРЫТ.
2. Плохой из тебя программист если ты не знаешь, как работает докумментированная процедура !
24 май 05, 11:21    [1566730]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как получить список столбцов таблицы  [new]
Диана Орел
Member

Откуда:
Сообщений: 1
А если ни в таблице sysobjects, ни в INFORMATION_SCHEMA.columns нет пользовательских таблиц?
8 июн 21, 10:03    [22332687]     Ответить | Цитировать Сообщить модератору
 Re: Как получить список столбцов таблицы  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3411
Диана Орел,

1. Смотрите не в той базе.
2. У вас нет прав.
8 июн 21, 10:17    [22332693]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить