Получить имена столбцов через Perl DBI

В SQL Server Management Studio 2008 я могу запускать

sp_columns MY_TABLE

чтобы получить имена всех столбцов (под COLUMN_NAME). Однако как я могу получить ту же информацию с помощью Perl DBI?

В частности, я пробовал

my $result = $dbh->selectall_hashref("sp_columns MY_TABLE", 'COLUMN_NAME');

надеясь, что имена столбцов будут ключами возвращаемого хэша.

На самом деле, даже если это удастся, это не то, что я хочу, так как мне нужно сохранить порядок столбцов в этой таблице. Так что я попробовал

my $sth = $dbh->prepare("sp_columns $table");
$sth->execute();
while (my @row = $sth->fetchrow_array) {
    # process @row;
}

Но ни то, ни другое не работает. Я получил сообщение об ошибке

DBD::Sybase::db selectall_hashref failed: Server message number=102 severity=15 state=1 line=1 server=XXXX text=Incorrect syntax near '.'

Я также сослался на этот пост. Очевидно, следующий запрос НЕ работает в моей Management Studio:

select * from information_schema.columns where table_name = MY_TABLE

с сообщением об ошибке

Msg 208, Level 16, State 1, Line 2
Invalid object name 'information_schema.columns'.

Пожалуйста помоги? Спасибо!


person Zhang18    schedule 21.01.2011    source источник
comment
Если вы получаете недопустимое имя объекта в INFORMATION_SCHEMA.COLUMNS, возможно, у вас нет разрешения. Если ваша сортировка чувствительна к регистру, вам также необходимо использовать все заглавные буквы. Но он определенно существует в SQL Server.   -  person ErikE    schedule 22.01.2011
comment
Бессмысленный. information_schema доступна во многих базах данных, включая MS SQL Server.   -  person bohica    schedule 24.01.2011
comment
INFORMATION_SCHEMA.COLUMNS - это вещь mysql5. Его нет в mysql 4.1.   -  person knb    schedule 24.01.2011
comment
Итак, очевидно, что @Emtucifor верен, что сортировка чувствительна к регистру на моем сервере, поэтому после изменения всего на верхний регистр я получил работу запроса, и я смог таким образом извлечь имена столбцов. Всем спасибо.   -  person Zhang18    schedule 24.01.2011
comment
Преобразование моего комментария в ответ ...   -  person ErikE    schedule 25.01.2011
comment
@DVK Мне очень жаль это говорить, но это неверно. INFORMATION_SCHEMA.COLUMNS тоже относится к SQL Server. В той же схеме, являются CHECK_CONSTRAINTS, COLUMN_DOMAIN_USAGE, COLUMN_PRIVILEGES, CONSTRAINT_COLUMN_USAGE, CONSTRAINT_TABLE_USAGE, DOMAIN_CONSTRAINTS, домены, KEY_COLUMN_USAGE, параметры, REFERENTIAL_CONSTRAINTS, ROUTINE_COLUMNS, ROUTINES, SCHEMATA, TABLE_CONSTRAINTS, TABLE_PRIVILEGES, ТАБЛИЦЫ, VIEW_COLUMN_USAGE и вид. Некоторые из них могут быть только SQL 2005 и выше, но многие доступны в SQL 2000.   -  person ErikE    schedule 25.01.2011


Ответы (3)


Если вы получаете недопустимое имя объекта в INFORMATION_SCHEMA.COLUMNS, возможно, у вас нет разрешения. Если ваша сортировка чувствительна к регистру, вам также необходимо использовать все заглавные буквы. Но он определенно существует в SQL Server.

person ErikE    schedule 24.01.2011

Возвращенные имена столбцов являются атрибутом подготовленного оператора, поэтому вы можете использовать:

my $dbh = DBI->connect('dbi:DBMS:...','','');
my $sth = $dbh->prepare("SELECT * FROM SomeTable");

и теперь $sth->{NAME} (ссылка на массив) содержит имена столбцов (с псевдонимами и т. д.).

person Jonathan Leffler    schedule 22.01.2011
comment
Я думаю, что $ sth - ›{NAME} должен вызываться в определенный момент времени (до обращения к данным в цикле). Если я правильно помню, он рано выходит из сферы действия. - person knb; 23.01.2011
comment
@knb: это может зависеть от драйвера. Конечно, это не выходит за рамки DBD :: Informix, пока дескриптор не будет уничтожен. - person Jonathan Leffler; 23.01.2011
comment
@ jonathan-leffler: В частности, я говорил о DBD :: Sybase. Возможно, однажды я попытался получить доступ к $ sth - ›{NAME} после того, как подпрограмма, в которой был создан $ sth, вышла за рамки. Не удалось найти пример кода вчера (и сегодня тоже). - person knb; 24.01.2011
comment
@ jonathan-leffler: Чтобы получить $ sth - ›{ИМЯ}, необходимо выполнить $ sth-› execute (). Я обычно добавляю WHERE 1 = 0 также, если мне нужна такая информация. (Я считаю) Некоторые БД возвращают весь набор результатов на некоторый клиентский уровень перед выборкой. - person runrig; 24.01.2011
comment
@runrig: возможно, вы правы для некоторых DBD; DBD :: Informix не требует выполнения до получения имен столбцов. - person Jonathan Leffler; 24.01.2011
comment
@ jonathan-leffler: Ах да, некоторые DBD - это то, что написано в документации. Я не знал этого о Informix, хотя это имеет смысл для баз данных, у которых есть фактическая фаза подготовки. - person runrig; 25.01.2011
comment
@runrig: Я знаю о DBD :: Informix - это я написал. Не могу так однозначно ответить по поводу других модулей DBD. - person Jonathan Leffler; 25.01.2011

См. методы каталога, которые поддерживает DBI. В частности, я ожидаю, что вам понадобится table_info.

person Dave Cross    schedule 21.01.2011