2013-09-11 8 views
3

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

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

Я создал хранимую процедуру (код ниже), которая выводит мои результаты в таблицу, но я хочу иметь возможность выполнять объединения и т. Д., Поэтому было бы очень удобно, если бы какой-то способ обернуть это в представление - Я думаю, что функция, ориентированная на таблицу, но я не совсем понял, как получить динамический SQL в функцию ... любая помощь приветствуется!

CREATE PROCEDURE [dbo].[usp_test] 
AS 
SET NOCOUNT ON; 
DECLARE @sql VARCHAR(MAX) 

SELECT @sql = ISNULL(@sql+' 

','')+'SELECT TOP (900) * 
            FROM OPENQUERY(Linked_Server, 
                'SELECT col1, col2, col3 

FROM dbo.'+ tableName+' 
       +' 
       UNION' FROM dbo.ls_views 

--dbo.ls_views is a view with the pertinent views/table names from the other server. 

Set @sql = @sql+ ' 
Select top (0) ''1'', ''2'',''3'' from sys.tables '   
--last select statement is to end multiple unions... not sure if there is a better way, but this works. 

    --PRINT (@sql); 
     --EXEC (@sql); 
EXECUTE sp_Executesql @sql 
    GO 
+1

Примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+1

Марк, ты прав. Я получил спешку, заменяя мой код «фиктивным» кодом. – CD4

+0

Поскольку вы уже используете связанные серверы, вы можете получить результаты с помощью OPENQUERY при выполнении хранимой процедуры: 'SELECT * FROM OPENQUERY (Linked_Server, 'EXEC [dbo]. [Usp_test]')' –

ответ

0

Возможно, у вас есть агент SQL, выполняющий это периодически, и дамп результатов в другую таблицу/набор таблиц в вашем db?

Тогда вы можете использовать его как прямое соединение в любом запросе, который вы хотите.

+0

Я подумал об этом, но основные части меняются часто, поэтому я действительно хочу получить доступ к «живым» данным. Это действительно мой план резервного копирования. – CD4

+0

Как часто изменяется схема Db? – StingyJack

+0

Он варьируется, иногда не на несколько часов, а затем, возможно, несколько раз в течение нескольких минут. Если у вас нет доступа к ней динамически, я планирую задание агента SQL, чтобы периодически выгружать результаты в таблицу. – CD4

Смежные вопросы