【问题标题】:Execute a Stored Procedure with a table as input使用表作为输入执行存储过程
【发布时间】:2013-08-14 02:15:35
【问题描述】:

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

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)

【问题讨论】:

  • 什么版本的sql server?
  • 您可以传入表名,然后从动态 SQL 执行您的操作。但为什么?您真正想要完成什么?你应该问这个问题,而不是问如何以这种特定方式解决这个问题。
  • 我使用的是 Microsoft SQL 2005
  • 存储过程为另一个发送电子邮件的存储过程获取多个字段的 1 条记录。
  • 好的,所以您真正需要的是为表中的每一行执行一个存储过程,对吧?您能否更新问题以使其更清楚,并删除有关将表或查询传递到存储过程的部分?

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


【解决方案1】:

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

不过,您可以考虑使用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

【讨论】:

  • 为什么光标在这里有用?你能演示一下吗?
  • @AaronBertrand,我添加了一个例子
  • 但是他是如何在存储过程中做到这一点的呢?存储过程不知道包含需要处理的数据的表的名称...
  • 我试图让自己免于输入所有代码。我可以选择 @myID = id, @myName = name 然后 exec sp_proc @myId, @myName
  • 从问题来看似乎不是问题。似乎认为 OP 正在尝试为行集(在这种情况下是用户表)执行 SP。我是否误解了 OP 要求?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你也应该看看thissolved SO thread。另外,我建议您查看 OPENXML 查询(传入表 xml 并使用 xpath 访问相应的字段)。

    查看这些示例:

    Example 1

    Example 2

    【讨论】:

      猜你喜欢
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多