Quassnoi поставил меня большую часть пути туда, но одна вещь отсутствовала:
**** Мне нужно было использовать параметры в хранимой процедуре. ****
И OPENQUERY не позволяет этому случиться:
Итак, я нашел способ работать с системой, а также не нужно делать определение таблицы настолько жестким и переопределять его внутри другой хранимой процедуры (и, конечно, воспользоваться возможностью, что она может сломаться)!
Да, вы можете динамически создать определение таблицы, возвращенное из хранимой процедуры,
используя оператор OPENQUERY с фиктивными переменными (если NO RESULT SET возвращает
такое же количество полей и в том же положении, что и набор данных с хорошими данными).
После создания таблицы вы можете использовать хранимую процедуру exec во временной таблице в течение всего дня.
И чтобы отметить (как указано выше), вы должны разрешить доступ к данным,
EXEC sp_serveroption 'MYSERVERNAME', 'DATA ACCESS', TRUE
Код:
declare @locCompanyId varchar(8)
declare @locDateOne datetime
declare @locDateTwo datetime
set @locDateOne = '2/11/2010'
set @locDateTwo = getdate()
--Build temporary table (based on bogus variable values)
--because we just want the table definition and
--since openquery does not allow variable definitions...
--I am going to use bogus variables to get the table defintion.
select * into #tempCoAttendanceRpt20100211
FROM OPENQUERY(DBASESERVER,
'EXEC DATABASE.dbo.Proc_MyStoredProc 1,"2/1/2010","2/15/2010 3:00 pm"')
set @locCompanyId = '7753231'
insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo
set @locCompanyId = '9872231'
insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo
select * from #tempCoAttendanceRpt20100211
drop table #tempCoAttendanceRpt20100211
Спасибо за информацию, которая была предоставлена изначально ...
Да, наконец, мне не нужно создавать все эти поддельные (строгие) определения таблиц при использовании данных из
другая хранимая процедура или база данных, и да вы также можете использовать параметры.
Поиск по тегу:
хранимая процедура SQL 2005 во временной таблице
openquery с хранимой процедурой и переменными 2005
открытый запрос с переменными
выполнить хранимую процедуру во временной таблице
Обновление: это не будет работать с временными таблицами , поэтому мне пришлось прибегнуть к созданию временной таблицы вручную.
Уведомление об обломе : это не будет работать с временными таблицами , http://www.sommarskog.se/share_data.html#OPENQUERY
Справка: Следующим шагом является определение LOCALSERVER. В примере это может выглядеть как ключевое слово, но на самом деле это только имя. Вот как вы это делаете:
sp_addlinkedserver @server = 'LOCALSERVER', @srvproduct = '',
@provider = 'SQLOLEDB', @datasrc = @@servername
Чтобы создать связанный сервер, вы должны иметь разрешение ALTER ANY SERVER или быть членом какой-либо из фиксированных ролей сервера sysadmin или setupadmin.
OPENQUERY открывает новое соединение с SQL Server. Это имеет некоторые последствия:
Процедура, которую вы вызываете с помощью OPENQUERY, не может ссылаться на временные таблицы, созданные в текущем соединении.
Новое соединение имеет собственную базу данных по умолчанию (определенную с помощью sp_addlinkedserver, по умолчанию - master), поэтому все спецификации объекта должны включать имя базы данных.
Если у вас есть открытая транзакция и вы удерживаете блокировки при вызове OPENQUERY, вызываемая процедура не может получить доступ к тому, что вы заблокировали. То есть, если вы не будете осторожны, вы заблокируете себя.
Подключение не бесплатное, поэтому снижается производительность.