Подтвердить что ты не робот

Как вызвать хранимую процедуру в представлении?

Как я могу вызвать хранимую процедуру, которая возвращает данные в представлении? Возможно ли это?

4b9b3361

Ответ 1

Эта конструкция не разрешена в SQL Server. Встроенная функция, ориентированная на таблицу, может выполняться как параметризованное представление, но до сих пор не разрешено вызывать такой SP.

Здесь некоторые примеры использования SP и встроенного TVF взаимозаменяемы - вы увидите, что TVF более гибкий (это в основном больше похоже на представление, чем функция), поэтому, когда можно использовать встроенный TVF, они могут быть более повторное использование:

CREATE TABLE dbo.so916784 (
    num int
)
GO

INSERT INTO dbo.so916784 VALUES (0)
INSERT INTO dbo.so916784 VALUES (1)
INSERT INTO dbo.so916784 VALUES (2)
INSERT INTO dbo.so916784 VALUES (3)
INSERT INTO dbo.so916784 VALUES (4)
INSERT INTO dbo.so916784 VALUES (5)
INSERT INTO dbo.so916784 VALUES (6)
INSERT INTO dbo.so916784 VALUES (7)
INSERT INTO dbo.so916784 VALUES (8)
INSERT INTO dbo.so916784 VALUES (9)
GO

CREATE PROCEDURE dbo.usp_so916784 @mod AS int
AS 
BEGIN
    SELECT  *
    FROM    dbo.so916784
    WHERE   num % @mod = 0
END
GO

CREATE FUNCTION dbo.tvf_so916784 (@mod AS int)
RETURNS TABLE
    AS
RETURN
    (
     SELECT *
     FROM   dbo.so916784
     WHERE  num % @mod = 0
    )
GO    

EXEC dbo.usp_so916784 3
EXEC dbo.usp_so916784 4

SELECT * FROM dbo.tvf_so916784(3)    
SELECT * FROM dbo.tvf_so916784(4)

DROP FUNCTION dbo.tvf_so916784
DROP PROCEDURE dbo.usp_so916784
DROP TABLE dbo.so916784

Ответ 2

exec sp_addlinkedserver 
        @server = 'local',
        @srvproduct = '',
        @provider='SQLNCLI',
        @datasrc = @@SERVERNAME
go

create view ViewTest
as
select * from openquery(local, 'sp_who')
go

select * from ViewTest
go

Ответ 3

Мне удалось вызвать хранимую процедуру в представлении (SQL Server 2005).

CREATE FUNCTION [dbo].[dimMeasure] 
   RETURNS  TABLE  AS

    (
     SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost; Trusted_Connection=yes;', 'exec ceaw.dbo.sp_dimMeasure2')
    )
RETURN
GO

Внутри хранимой процедуры нам нужно установить:

set nocount on
SET FMTONLY OFF
CREATE VIEW [dbo].[dimMeasure]
AS

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'exec ceaw.dbo.sp_dimMeasure2')

GO

Ответ 4

Если вы используете Sql Server 2005, вы можете использовать табличные функции. Вы можете вызвать их напрямую и передать параметры, рассматривая их так, как если бы они были таблицами.

Для получения дополнительной информации Пользовательские функции с табличным значением

Ответ 5

Вам понадобится script Вид, как показано ниже. Вы по существу записываете результаты своего proc в таблицу var или temp, затем выбираете в виде.Забастовкa >

Изменить. Если вы можете изменить хранимую процедуру на функцию значения таблицы, она устранит шаг выбора в таблице temp.

** Редактировать 2 ** - Исправлены комментарии, что sproc не может быть прочитан в виде, как я предложил. Вместо этого преобразуйте proc в функцию table-value, как указано в других сообщениях, и выберите из этого:

create view sampleView
as select field1, field2, ... 
from dbo.MyTableValueFunction

Извиняюсь за путаницу

Ответ 6

create view sampleView as 
select field1, field2, ... 
from dbo.MyTableValueFunction

Обратите внимание, что даже если ваша функция MyTableValueFunction не принимает никаких параметров, вам все равно необходимо включить в нее скобки, то есть:

... from dbo.MyTableValueFunction()

Без круглых скобок вы получите ошибку "Недопустимое имя объекта".

Ответ 7

CREATE VIEW [dbo].[dimMeasure]
AS

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;'
                         , 'exec ceaw.dbo.sp_dimMeasure2')

GO