Как запросить представление с SQL-сервера с помощью Perl и DBD :: ODBC? - PullRequest
0 голосов
/ 26 ноября 2009

Я могу запросить базу данных SQL-сервера в порядке. Проблема возникает, когда я пытаюсь запросить представление.

Я не пытаюсь сделать что-нибудь сумасшедшее:

 $sql = 'select * from location_v';
 $stj = $db_destination->prepare($sql);

Он продолжает умирать на линии подготовки. Вот что я получаю обратно (что не так уж и полезно):

DBD::ODBC::db prepare failed: (DBD: st_prepare/SQLPrepare err=-1)

Разве представления не должны обрабатываться точно так же, как таблица? Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 27 ноября 2009

Вы пробовали использовать dbo. префикс имени представления (SELECT * FROM dbo.location_v)? Вы проверили, что вид на самом деле находится в dbo. схема? Проверяли ли вы разрешения для представления и / или базовых таблиц, из которых выбирается представление? К сожалению, ODBC не выдает здесь очень значимого сообщения об ошибке, поэтому это может быть любое количество вещей, но скорее всего это либо объект, который не найден (из-за префикса или вы находитесь в неправильной базе данных), либо разрешения.

1 голос
/ 27 ноября 2009

Да, представления должны быть неотличимы от таблиц для этого запроса.

Можете ли вы запросить представление (а не только базу данных в целом)?

Код ошибки -1 не сильно указывает на что-то конкретное в качестве проблемы. Иногда это может быть «нет разрешения», но это может быть что угодно.

Я предлагаю посмотреть, где проблема, используя DBI_TRACE = 9 (или, возможно, меньшие числа), установленные в среде (или используйте $dbh->trace(9)). Это должно дать вам много информации (не все это понятно) о том, что происходит; это может показать вам, где проблема на самом деле.

0 голосов
/ 27 ноября 2009

Arg. Я нашел проблему. У меня было несколько запросов, прежде чем я запросил представление, и я не закрывал свой дескриптор перед открытием нового. Все, что мне нужно было сделать, это до того, как я запустил запрос:

undef $stj;

Надеюсь, это поможет кому-то еще.

...