SQL - Как вставить результаты Stored_Proc в новую таблицу без указания столбцов новой таблицы? - PullRequest
2 голосов
/ 12 февраля 2010

Используя SQL Server 2005, я хотел бы запустить хранимую процедуру и вставить все результаты в новую таблицу.

Я бы хотел, чтобы новая таблица имела своюстолбцы автоматически настраиваются на основе данных, возвращаемых хранимой процедурой.

Я знаком с использованием синтаксиса SELECT ... INTO:

SELECT * INTO newtable FROM oldtable

Возможно ли это?

Редактировать для уточнения: Я надеюсь выполнить что-то вроде:

Select * INTO newtable FROM exec My_SP

Ответы [ 3 ]

2 голосов
/ 12 февраля 2010

Единственный способ сделать это - w / OPENROWSET для локального сервера:

SELECT * INTO #temp 
FROM OPENROWSET (
    'SQLOLEDB'
  , 'Server=(local);TRUSTED_CONNECTION=YES;'
  , 'SET FMTONLY OFF EXEC database.schema.procname'
  ) a

Но это своего рода метод "последний куш, надо делать, черт побери". Это требует повышенных разрешений, не работает для всех процедур и, как правило, неэффективно.

Больше информации и некоторые альтернативы здесь: http://www.sommarskog.se/share_data.html

2 голосов
/ 12 февраля 2010

Это похоже на ужасный дизайн. Вы действительно собираетесь создать новую таблицу для хранения результатов хранимой процедуры, каждый раз, когда хранимая процедура вызывается? И вы действительно не можете создать таблицу заранее, потому что совершенно не представляете, какой вывод имеет хранимая процедура? Что если хранимая процедура возвращает несколько наборов результатов? Что, если у него есть побочные эффекты?

Хорошо, хорошо, если вы действительно хотите это сделать ...

Один из способов сделать это - использовать ваш локальный сервер в качестве связанного сервера и использовать OPENQUERY. Сначала вам нужно убедиться, что ваш локальный сервер настроен для доступа к данным:

EXEC sp_serveroption 'local server name', 'DATA ACCESS', true;

Тогда вы можете сделать что-то вроде этого:

SELECT * INTO dbo.newtable
FROM OPENQUERY('local server name', 'EXEC yourdb.dbo.yourproc;');

PS Как вы собираетесь писать код, который будет выполнять SELECT INTO, каждый раз под новым именем таблицы (потому что вы можете выполнить SELECT INTO только один раз)? Динамический SQL? Что произойдет, если два пользователя запустят этот код одновременно? Один из них выигрывает, а другой просто получает сообщение об ошибке?

0 голосов
/ 12 февраля 2010

Вариация же

create table somename
  select * from wherever;
...