Как я могу вызвать хранимую процедуру, которая возвращает данные в представлении? Возможно ли это?
Как вызвать хранимую процедуру в представлении?
Ответ 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