У меня есть хранимая процедура, которая возвращает 80 столбцов и 300 строк. Я хочу написать выбор, который получает 2 из этих столбцов. Что-то вроде
SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'
Когда я использовал приведенный выше синтаксис, я получаю сообщение об ошибке:
«Неверное имя столбца».
Я знаю, что самым простым решением было бы изменить хранимую процедуру, но я ее не написал и не могу ее изменить.
Есть ли способ сделать то, что я хочу?
Я мог бы создать временную таблицу для размещения результатов, но поскольку там 80 столбцов, поэтому мне нужно было бы создать временную таблицу из 80 столбцов, чтобы получить 2 столбца. Я хотел избежать отслеживания всех возвращаемых столбцов.
Я пытался использовать
WITH SprocResults AS ....
как предложено Марком, но я получил 2 ошибкиНеверный синтаксис рядом с ключевым словом «EXEC».
Неверный синтаксис рядом с ')'.Я попытался объявить переменную таблицы, и я получил следующую ошибку
Ошибка вставки: имя столбца или количество предоставленных значений не соответствует определению таблицы
Если я пытаюсь,
SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
я получаю ошибку:Неверный синтаксис рядом с ключевым словом «exec».
источник
EXEC
не является ключевым словом MySQL (эквивалент MySQL - подготовленные операторы ). Хотя я хотел бы знать ответ для MySQL, ответы ниже нацелены на T-SQL. Работа с тегами.Ответы:
Вы можете разделить запрос? Вставьте сохраненные результаты процедуры в табличную переменную или временную таблицу. Затем выберите 2 столбца из табличной переменной.
источник
Вот ссылка на довольно хороший документ, объясняющий все различные способы решения вашей проблемы (хотя многие из них не могут быть использованы, поскольку вы не можете изменить существующую хранимую процедуру).
Как обмениваться данными между хранимыми процедурами
Ответ Гульзара будет работать (он задокументирован в ссылке выше), но его будет сложно написать (вам нужно будет указать все 80 имен столбцов в вашем операторе @tablevar (col1, ...). И в будущем если столбец добавляется в схему или изменяется выходной файл, его необходимо обновить в коде, иначе произойдет ошибка.
источник
Источник:
http://stevesmithblog.com/blog/select-from-a-stored-procedure/
источник
Это работает для меня: (т.е. мне нужно только 2 столбца из 30+, возвращаемых
sp_help_job
)Прежде чем это сработает, мне нужно запустить это:
.... обновить
sys.servers
таблицу. (т.е. использование собственной ссылки в OPENQUERY, по-видимому, отключено по умолчанию.)По моему простому требованию я не столкнулся ни с одной из проблем, описанных в разделе ОТКРЫТИЯ превосходной ссылки Ланса.
Россини, если вам нужно динамически установить эти входные параметры, тогда использование OPENQUERY становится немного сложнее:
Я не уверен в различиях (если таковые имеются) между использованием
sp_serveroption
дляsys.servers
непосредственного обновления существующей ссылки на себя и использованиемsp_addlinkedserver
(как описано в ссылке Ланса) для создания дубликата / псевдонима.Примечание 1: Я предпочитаю OPENQUERY, а не OPENROWSET, учитывая, что OPENQUERY не требует определения строки соединения в рамках proc.
Примечание 2: Сказав все это: обычно я бы просто использовал INSERT ... EXEC :) Да, это 10 минут дополнительной печати, но если я могу помочь, я предпочитаю не шутить:
(a) кавычки внутри кавычек внутри кавычки и
(б) sys-таблицы и / или хитрые самоссылочные настройки связанных серверов (т. е. для них мне нужно доверить свое дело нашим всемогущим администраторам баз данных :)
Однако в этом случае я не мог использовать конструкцию INSERT ... EXEC, как
sp_help_job
она уже используется. («Оператор INSERT EXEC не может быть вложенным.»)источник
Чтобы достичь этого, сначала создайте
#test_table
подобное ниже:Теперь выполните процедуру и введите значение в
#test_table
:Теперь вы получаете значение из
#test_table
:источник
Если вы можете изменить хранимую процедуру, вы можете легко поместить необходимые определения столбцов в качестве параметра и использовать автоматически созданную временную таблицу:
В этом случае вам не нужно создавать временную таблицу вручную - она создается автоматически. Надеюсь это поможет.
источник
Может быть полезно знать, почему это так сложно. Хранимая процедура может только возвращать текст (печатать «текст»), или может возвращать несколько таблиц, или может вообще не возвращать таблицы.
Так что как
SELECT * FROM (exec sp_tables) Table1
то не получитсяисточник
(Предполагая SQL Server)
Единственный способ работать с результатами хранимой процедуры в T-SQL - это использовать
INSERT INTO ... EXEC
синтаксис. Это дает вам возможность вставить во временную таблицу или табличную переменную и оттуда выбрать нужные данные.источник
Быстрый способ - добавить новый параметр
'@Column_Name'
и заставить вызывающую функцию определить имя столбца для извлечения. В возвращаемой части вашего sproc вы должны иметь операторы if / else и возвращать только указанный столбец, или, если он пуст - возвращать все.источник
Если вы делаете это для ручной проверки данных, вы можете сделать это с помощью LINQPad.
Создайте соединение с базой данных в LinqPad, затем создайте операторы C #, подобные следующим:
Ссылка http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx
источник
Я считаю, что для SQL Server это работает нормально:
Создайте временную таблицу (или постоянную таблицу, на самом деле не имеет значения) и вставьте оператор в хранимую процедуру. Результирующий набор SP должен соответствовать столбцам в вашей таблице, иначе вы получите ошибку.
Вот пример:
Это оно!
источник
Как уже упоминалось в этом вопросе, трудно определить временную таблицу из 80 столбцов перед выполнением хранимой процедуры.
Таким образом, другой способ - заполнить таблицу на основе набора результатов хранимой процедуры.
Если вы получаете какую-либо ошибку, вам нужно включить специальные распределенные запросы, выполнив следующий запрос.
Чтобы выполнить
sp_configure
оба параметра, чтобы изменить параметр конфигурации или выполнитьRECONFIGURE
инструкцию, вам необходимо предоставитьALTER SETTINGS
разрешение на уровне сервера.Теперь вы можете выбрать ваши конкретные столбцы из сгенерированной таблицы
источник
попробуй это
источник
Я знаю, что выполнение из sp и вставка во временную таблицу или табличную переменную будет вариантом, но я не думаю, что это ваше требование. В соответствии с вашим требованием должен работать следующий запрос:
если у вас есть доверенное соединение, используйте следующую инструкцию запроса:
если вы получаете ошибку при выполнении вышеприведенного оператора, просто запустите этот оператор ниже:
Я надеюсь, что это поможет кому-то, кто столкнулся с подобной проблемой. Если кто-то попытается использовать временную таблицу или переменную таблицы, которая должна быть такой, как показано ниже, но в этом сценарии вы должны знать, сколько столбцов возвращает sp, тогда вам следует создать столько столбцов во временной таблице или переменной таблицы:
источник
Для тех, кто имеет SQL 2012 или более позднюю версию, я смог выполнить это с помощью хранимых процедур, которые не являются динамическими и каждый раз выдают одинаковые столбцы.
Основная идея заключается в том, что я создаю динамический запрос для создания, вставки, выбора и удаления временной таблицы и выполняю ее после того, как она все сгенерирована. Я динамически генерирую временную таблицу, сначала извлекая имена и типы столбцов из хранимой процедуры .
Примечание: есть гораздо лучшие, более универсальные решения, которые будут работать с меньшим количеством строк кода, если вы захотите / сможете обновить SP или изменить конфигурацию и использовать
OPENROWSET
. Используйте ниже, если у вас нет другого пути.источник
Самый простой способ сделать это, если вам нужно сделать это только один раз:
Экспорт в Excel в мастере импорта и экспорта, а затем импортировать этот Excel в таблицу.
источник
Создайте динамическое представление и получите от него результат .......
источник
Я бы вырезал и вставил оригинальный SP и удалил все столбцы, кроме 2, которые вы хотите. Или. Я бы вернул набор результатов обратно, сопоставил бы его с соответствующим бизнес-объектом, а затем LINQ из двух столбцов.
источник