Я сталкиваюсь с трудностями с PDO и соединением SqlSrv, которое использует общее табличное выражение для создания таблицы в памяти, на которую ссылается запрос, который должен произвести вывод запроса. Более подробно о проблеме можно прочитать в вопросе о том, что я разместил ранее сегодня: вопрос.
Скажи, у меня есть этот запрос:
-- app.use("Dummy Foo Bar Baz table")
/**
* The above line is a custom made syntax that lets me include
* common SQL parts I need often in different queries.
*/
select * from @table
С помощью preg_match_all
Я ищу все -- app.use("(.*)")
обыкновения. В фоновом режиме это просто проверяет таблицу с предопределенными запросами для столбца имени с заданным именем и включает этот SQL в запрос, который будет выполнен. В этом случае SQL для «Dummy Foo Bar Baz table» выглядит так:
declare @table table(id int, name varchar(255))
insert into @table values (1, 'foo')
insert into @table values (2, 'bar')
insert into @table values (3, 'baz')
Полный запрос к базе данных SQL Server:
declare @table table(id int, name varchar(255))
insert into @table values (1, 'foo')
insert into @table values (2, 'bar')
insert into @table values (3, 'baz')
select * from @table
Когда я запускаю это, я получаю The active result for the query contains no fields
ошибка. Запрос отлично работает в SQL Server Management Studio. Я полагаю, что это вызвано тем, что SSMS внутренне обрабатывает или сохраняет результат CTE в памяти, а PDO не поддерживает это или, по крайней мере, игнорирует это на данный момент.
Альтернативный подход к получению результата из вышеуказанного запроса
Поэтому мне было интересно, можно ли его сломать, не перестраивая интерпретатор SQL, а выполнив все app.use(..)
и сохранить их в памяти (или в месте, где он находится, чтобы я мог ссылаться на него) и использовать их для «окончательного» запроса select * from @table
,
У пользователя базы данных, к которой я обращаюсь, есть доступ только для чтения (и изменить разрешения нельзя), поэтому хранимые процедуры не являются решением.
Можно ли это сделать?
Задача ещё не решена.
Других решений пока нет …