Sql 以表作为输入执行存储过程

Sql 以表作为输入执行存储过程,sql,sql-server,sql-server-2005,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

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

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)

不,不能将表作为那样的参数传递

不过,您可以考虑使用(SQLServer2008以上版本)

然而,在您的情况下,似乎您可能正在考虑使用一个相当简单的方法

请注意,游标执行确实会对基于集合的查询的性能产生影响

Re@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

不,不能将表作为那样的参数传递

不过,您可以考虑使用(SQLServer2008以上版本)

然而,在您的情况下,似乎您可能正在考虑使用一个相当简单的方法

请注意,游标执行确实会对基于集合的查询的性能产生影响

Re@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

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

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

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

参见以下示例:


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

参见以下示例:



什么版本的sql server?您可以传入表名,然后从动态sql执行操作。但是为什么呢?你到底想完成什么?你应该问这个问题,而不是问如何以这种特定的方式解决这个问题。我使用的是Microsoft SQL 2005存储过程为另一个电子邮件发送存储过程获取多个字段的一条记录。好的,那么你真正需要的是为表中的每一行执行一个存储过程,对吗?您是否可以更新该问题以使其更清楚,并删除有关将表或查询传递到存储过程的部分?sql server的哪个版本?您可以传入表名,然后从动态sql执行操作。但是为什么呢?你到底想完成什么?你应该问这个问题,而不是问如何以这种特定的方式解决这个问题。我使用的是Microsoft SQL 2005存储过程为另一个电子邮件发送存储过程获取多个字段的一条记录。好的,那么你真正需要的是为表中的每一行执行一个存储过程,对吗?您是否可以更新问题以使其更清楚,并去掉关于将表或查询传递到存储过程的部分?为什么游标在这里有用?你能演示一下怎么做吗?@AaronBertrand,我添加了一个示例,但他是如何在存储过程中做到这一点的?存储过程不知道包含需要处理的数据的表的名称…我试图避免键入所有代码。我可以从问题中选择@myID=id、@myName=name,然后选择exec sp_proc@myID、@myName。更像是OP试图为一个行集(在本例中是一个用户表)执行一个SP。我是否误解了OPs要求?为什么光标在这里有用?你能演示一下怎么做吗?@AaronBertrand,我添加了一个示例,但他是如何在存储过程中做到这一点的?存储过程不知道包含需要处理的数据的表的名称…我试图避免键入所有代码。我可以从问题中选择@myID=id、@myName=name,然后选择exec sp_proc@myID、@myName。更像是OP试图为一个行集(在本例中是一个用户表)执行一个SP。我是否误解了老年退休金计划的要求?