如何在视图中调用存储过程?
How to call Stored Procedure in Views?
我的存储过程没有参数。 运行 如下:-
EXEC sp_Email_spd_CasualNotification
Returns一个table:-
DeptChangeID| oldDeptID |DeptID | JobID |EmpID
33419 | NULL | 679 | 3742 |16575
42392 | NULL | 783 | 4742 |100000378
我想在视图中查看此 table。我就是找不到办法。
我的意思是
CREATE View [dbo].[vw_EmploymentLatest] as
Select * from (EXEC sp_Email_spd_CasualNotification)
这是不可能的。
我的存储过程简化如下:-
declare @empTable table (employeeID int)
declare @selectedDeptChangeIDTable table (deptChangeID int)
declare @rowCount int
declare @rowNum int
declare @selectedDeptChangeID int
declare @empID int
Insert into @empTable (employeeID)
SELECT DISTINCT
E.Employee_ID
FROM Employee E
'
'
WHILE exists (select * from @empTable)
BEGIN
SELECT @empID = (select top 1 employeeID from @empTable order by employeeID asc)
'
'
WHILE @rowNum <= @rowCount
BEGIN
declare @p1 int
declare @p2 int
'
'
'
'
DELETE @empTable WHERE employeeID = @empID
END
Select * from Employment Where DeptChangeID in (Select deptChangeID from @selectedDeptChangeIDTable)
CREATE PROCEDURE dbo.Test
AS
SELECT * FROM sys.tables
GO
EXEC dbo.Test
更新:用于视图(为什么?可以通过 table/inline 函数?)
添加链接服务器(本地)
EXECUTE sp_addlinkedserver @server = N'LinkedServer', @srvproduct = N'sqlserver', @provider = N'SQLNCLI', @datasrc = N'LinkedServer.domain';
并尝试
CREATE VIEW dbo.vw
AS
SELECT *
FROM OPENQUERY(LinkedServer, 'EXEC [YOURDB].dbo.Test') AS a
GO
SELECT * FROM dbo.vw
您的过程应包含关于您要查询的 table(s) 的 SELECT
语句。
示例:
SELECT * FROM myTable
然后你调用你的程序:
EXEC sp_Email_spd_CasualNotification
如果您的程序没有对 table 进行任何更改,为什么不考虑使用 FUNCTION
?
注意:sp_
前缀是为系统存储过程保留的,所以我会更改名称。
存储过程不适用于视图(或函数)内。您必须在视图或函数上编写查询。
让我们假设这个存储过程:
CREATE PROCEDURE dbo.Test
AS
SELECT * FROM sys.tables
GO
EXEC dbo.Test
它可以转换成一个 table 值的函数,像这样:
CREATE FUNCTION dbo.Test
RETURNS TABLE AS
RETURN (
SELECT * FROM sys.tables
)
GO
SELECT * FROM dbo.Test()
如果您愿意,现在可以在视图中使用它。
这是更简单的语法(内联函数),但对于任何复杂的存储过程,您都需要将其转换为多语句 table 值函数。
CREATE FUNCTION dbo.Test
RETURNS @Test TABLE (object_id int, name varchar(100))
AS
BEGIN
INSERT INTO @Test (object_id, name)
SELECT object_id, name FROM sys.tables
END
GO
SELECT * FROM dbo.Test()
查看您提供的代码,您的函数应该是这样的:
CREATE FUNCTION dbo.Email_spd_CasualNotification
RETURNS @CasualNotification TABLE (DeptChangeID int, oldDeptID int, DeptID int, JobID int, EmpID int)
AS
BEGIN
declare @empTable table (employeeID int)
declare @selectedDeptChangeIDTable table (deptChangeID int)
declare @rowCount int
declare @rowNum int
declare @selectedDeptChangeID int
declare @empID int
Insert into @empTable (employeeID)
SELECT DISTINCT
E.Employee_ID
FROM Employee E
'
'
WHILE exists (select * from @empTable)
BEGIN
SELECT @empID = (select top 1 employeeID from @empTable order by employeeID asc)
'
'
WHILE @rowNum <= @rowCount
BEGIN
declare @p1 int
declare @p2 int
'
'
'
'
DELETE @empTable WHERE employeeID = @empID
END
END
insert into @CasualNotification(DeptChangeID, oldDeptID, DeptID, JobID, EmpID)
Select DeptChangeID, oldDeptID, DeptID, JobID, EmpID
from Employment
Where DeptChangeID in (Select deptChangeID from @selectedDeptChangeIDTable)
END
我的存储过程没有参数。 运行 如下:-
EXEC sp_Email_spd_CasualNotification
Returns一个table:-
DeptChangeID| oldDeptID |DeptID | JobID |EmpID
33419 | NULL | 679 | 3742 |16575
42392 | NULL | 783 | 4742 |100000378
我想在视图中查看此 table。我就是找不到办法。 我的意思是
CREATE View [dbo].[vw_EmploymentLatest] as
Select * from (EXEC sp_Email_spd_CasualNotification)
这是不可能的。
我的存储过程简化如下:-
declare @empTable table (employeeID int)
declare @selectedDeptChangeIDTable table (deptChangeID int)
declare @rowCount int
declare @rowNum int
declare @selectedDeptChangeID int
declare @empID int
Insert into @empTable (employeeID)
SELECT DISTINCT
E.Employee_ID
FROM Employee E
'
'
WHILE exists (select * from @empTable)
BEGIN
SELECT @empID = (select top 1 employeeID from @empTable order by employeeID asc)
'
'
WHILE @rowNum <= @rowCount
BEGIN
declare @p1 int
declare @p2 int
'
'
'
'
DELETE @empTable WHERE employeeID = @empID
END
Select * from Employment Where DeptChangeID in (Select deptChangeID from @selectedDeptChangeIDTable)
CREATE PROCEDURE dbo.Test
AS
SELECT * FROM sys.tables
GO
EXEC dbo.Test
更新:用于视图(为什么?可以通过 table/inline 函数?)
添加链接服务器(本地)
EXECUTE sp_addlinkedserver @server = N'LinkedServer', @srvproduct = N'sqlserver', @provider = N'SQLNCLI', @datasrc = N'LinkedServer.domain';
并尝试
CREATE VIEW dbo.vw
AS
SELECT *
FROM OPENQUERY(LinkedServer, 'EXEC [YOURDB].dbo.Test') AS a
GO
SELECT * FROM dbo.vw
您的过程应包含关于您要查询的 table(s) 的 SELECT
语句。
示例:
SELECT * FROM myTable
然后你调用你的程序:
EXEC sp_Email_spd_CasualNotification
如果您的程序没有对 table 进行任何更改,为什么不考虑使用 FUNCTION
?
注意:sp_
前缀是为系统存储过程保留的,所以我会更改名称。
存储过程不适用于视图(或函数)内。您必须在视图或函数上编写查询。
让我们假设这个存储过程:
CREATE PROCEDURE dbo.Test
AS
SELECT * FROM sys.tables
GO
EXEC dbo.Test
它可以转换成一个 table 值的函数,像这样:
CREATE FUNCTION dbo.Test
RETURNS TABLE AS
RETURN (
SELECT * FROM sys.tables
)
GO
SELECT * FROM dbo.Test()
如果您愿意,现在可以在视图中使用它。
这是更简单的语法(内联函数),但对于任何复杂的存储过程,您都需要将其转换为多语句 table 值函数。
CREATE FUNCTION dbo.Test
RETURNS @Test TABLE (object_id int, name varchar(100))
AS
BEGIN
INSERT INTO @Test (object_id, name)
SELECT object_id, name FROM sys.tables
END
GO
SELECT * FROM dbo.Test()
查看您提供的代码,您的函数应该是这样的:
CREATE FUNCTION dbo.Email_spd_CasualNotification
RETURNS @CasualNotification TABLE (DeptChangeID int, oldDeptID int, DeptID int, JobID int, EmpID int)
AS
BEGIN
declare @empTable table (employeeID int)
declare @selectedDeptChangeIDTable table (deptChangeID int)
declare @rowCount int
declare @rowNum int
declare @selectedDeptChangeID int
declare @empID int
Insert into @empTable (employeeID)
SELECT DISTINCT
E.Employee_ID
FROM Employee E
'
'
WHILE exists (select * from @empTable)
BEGIN
SELECT @empID = (select top 1 employeeID from @empTable order by employeeID asc)
'
'
WHILE @rowNum <= @rowCount
BEGIN
declare @p1 int
declare @p2 int
'
'
'
'
DELETE @empTable WHERE employeeID = @empID
END
END
insert into @CasualNotification(DeptChangeID, oldDeptID, DeptID, JobID, EmpID)
Select DeptChangeID, oldDeptID, DeptID, JobID, EmpID
from Employment
Where DeptChangeID in (Select deptChangeID from @selectedDeptChangeIDTable)
END