Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

MS SQL 2005 - список полей

341  
Murr коренной житель15.05.09 17:08
Murr
15.05.09 17:08 
На сегодня вопросик такой - Как получить список полей в таблице MS SQL 2005?
Понятное дело, что нужен сервер и имя базы - это получил без особого труда.
Реально - получил больше - список доступных серверов и список баз на них.
Немного повозился и получил список таблиц в выбранных базах. Теперь пытаюсь
получить список полей в каждой таблице.
Есть куча вспомогательных системных вьюшек
INFORMATION_SCHEMA.COLUMNS
sys.all_columns
sys.columns
по информативности устраивает последняя, но... в ней нет никаких ссылок на
таблицы к которым они принадлежат.
Кто-нибудь делал такое? Какие будут идеи по получению связки таблицы->поля?
Смотрел SqlSMO. Там можно легко получить что надо, но SqlSMO не работает без
сетевого соединения.
#1 
  digital.pilot коренной житель15.05.09 17:27
digital.pilot
NEW 15.05.09 17:27 
в ответ Murr 15.05.09 17:08
я стараюсь INFORMATION_SCHEMA пользоваться. Имя таблицы в INFORMATION_SCHEMA.COLUMNS тоже есть.
а связь с таблицей в sys'ах просто через WHERE ([id] = OBJECT_ID('моя_таблица'))
#2 
Murr коренной житель15.05.09 20:25
Murr
NEW 15.05.09 20:25 
в ответ digital.pilot 15.05.09 17:27
Так в том то и проблема, что там ссылочного id, как такового не имеется.
ID таблицы, к примеру, 1582628681, но в списке-выборке полей sys.columns такого значения просто не упоминается.
А в INFORMATION_SCHEMA мне не достаточно деталей поля.
#3 
  digital.pilot коренной житель15.05.09 23:07
digital.pilot
NEW 15.05.09 23:07 
в ответ Murr 15.05.09 20:25, Последний раз изменено 15.05.09 23:09 (digital.pilot)
а, подожди, я тебя неправильно понял. Столб id есть, но в нем нет нужного тебе значения? Тогда, скорее всего, проблема в том, что ты делаешь селект из sys.columns из-под логина, у которого нет прав на нужную тебе таблицу. Я при переходе на 2005 тоже напоролся на эти грабли. Если у пользователя нет прав на какой-то объект, то выполненные им селекты из системных таблиц не выдадут информацию об этом объекте. Это новая фича по сравнению с 2000.
#4 
Lina_Meier постоялец15.05.09 23:12
Lina_Meier
NEW 15.05.09 23:12 
в ответ Murr 15.05.09 17:08
select * from sys.columns WHERE object_id IN (select object_id from sys.tables where name like 'ТАБЛИЧКА')
#5 
  digital.pilot коренной житель15.05.09 23:13
digital.pilot
NEW 15.05.09 23:13 
в ответ Lina_Meier 15.05.09 23:12
это то же самое, что я предлагал с OBJECT_ID, только в более извращенной форме
#6 
Murr коренной житель16.05.09 00:44
Murr
NEW 16.05.09 00:44 
в ответ digital.pilot 15.05.09 23:07
Столбца id - нет, есть - object_id.
Но при коннекте родными тулузами получалась глупость... хотя вроде админом залогинился и он же владелец всех схем.
Смешно, но тоже самое, выполненное из тулузы 2008 отработало на раз.
Ладушки - в понедельник буду мучать эту проблему - там еще схемы в наборе, а shema.table он вроде не понимает...
#7 
Murr коренной житель16.05.09 00:45
Murr
NEW 16.05.09 00:45 
в ответ Lina_Meier 15.05.09 23:12
Спасибочки - вроде наполовину дышит...
#8 
-=barmaley=- гость17.05.09 23:57
-=barmaley=-
NEW 17.05.09 23:57 
в ответ Murr 16.05.09 00:45, Последний раз изменено 17.05.09 23:59 (-=barmaley=-)
Припозднился с ответом, но может еше пригодится :)
1. select [name] from dbo.syscolumns where id = object_id(N'[dbo].[myTable]') // работа с object_id
2. exec sp_help 'myTable' // MS SQL - зависит от версии
3.select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'myTable' //работает в MS SQL Server 2000/2005/2008 and MySql 5
....
хех, не читал ответы выше, в итоге ничего нового не открыл
#9 
AlterEgo Чеширръ20.05.09 19:57
AlterEgo
NEW 20.05.09 19:57 
в ответ -=barmaley=- 17.05.09 23:57
string.Format(
@"SELECT SC.NAME as Name,ST.Name as Type,SC.Length as Length " +
@"FROM SYSOBJECTS SO, SYSCOLUMNS SC, SYSTYPES ST " +
@"WHERE SO.XTYPE='U' AND ST.xtype = SC.xtype AND SC.id = SO.id AND SO.Name = '{0}'",name);


*Ъ...
#10