使用表作为输入执行存储过程

时间:2013-08-12 16:57:37

标签: sql sql-server sql-server-2005

是否可以使用表作为存储过程的输入?

EXEC sp_Proc SELECT * FROM myTable

我创建了一个函数来返回一个由单个记录组成的表。

ALTER FUNCTION dbo.preEmail
(
 @Num INT,
 @WID INT
)
RETURNS 
@Results TABLE 

(
 WID char(10),
 Company nchar(50),
 Tech nchar(25),
 StartDate datetime,
 Description varchar(max),
 Address varchar(200),
 Phone varchar(15),
 Status varchar(35)

)
AS
BEGIN

INSERT INTO @Results 
    (WID, Company, Tech, StartDate, Description, Address, Phone, Status)

SELECT WID, company, tech, startDate, description, address, phone, status
FROM wo_tbl
WHERE Num = @Number AND wid = @WID


RETURN 
END
GO

接下来,我有一个存储过程,向上述记录中安排的技术人员发送电子邮件。

EXEC sp_emailTech @WID, @Company, @Tech, @StartDate, @Description, @Address, @Phone, @Status. 

但我宁愿做

EXEC sp_emailTech SELECT * FROM dbo.preEmail(1, 5746)

3 个答案:

答案 0 :(得分:3)

不,您不能将表作为参数传递。

但是,您可以查看使用Use Table-Valued Parameters (Database Engine)(SQL Server 2008版)

在您的情况下,您似乎可能正在考虑使用DECLARE CURSOR (Transact-SQL)而不是。

请注意,光标执行确实会对基于集合的查询造成性能损失。

回复@Aaron Bertrand评论

DECLARE @id INT,
@name varchar(5)

DECLARE Cur CURSOR FOR
SELECT *
FROM myTable

OPEN Cur

FETCH NEXT FROM Cur INTO @ID, @Name

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_Proc @id, @Name
    FETCH NEXT FROM Cur INTO @ID, @Name
END

CLOSE Cur
DEALLOCATE Cur

答案 1 :(得分:0)

首先,声明一个表变量来保存结果。然后,使用rigth参数执行SP,并将结果保存在先前声明的表变量中。然后,选择此表的内容。

答案 2 :(得分:0)

您还应该看看this已解决的SO线程。另外,我建议你看看OPENXML查询(传入表xml并使用xpath访问相应的字段)。

请参阅以下示例:

Example 1

Example 2