【问题标题】:How do I pass temp table columns to a stored procedure?如何将临时表列传递给存储过程?
【发布时间】:2014-06-11 09:30:52
【问题描述】:

我有一个存储过程,它在其中调用另一个存储过程。我创建了一个临时表,其中包含我想要传递给内部存储过程的值。有没有办法做到这一点而不必创建一堆变量?

一个例子:

CREATE PROCEDURE usr_AdminSaveChanges 
    -- Add the parameters for the stored procedure here
        @blah varchar(5) = NULL,
        @tid int = NULL
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- only returns one row
    select testid, testfoo, testbar
    into #testtemp
    from testtable
    where tid = @tid

    exec usr_updateTestSP #testtemp.testid, @blah, #testtemp.testbar
END

【问题讨论】:

    标签: sql sql-server tsql stored-procedures parameters


    【解决方案1】:

    实际上,您不必做任何事情,在调用过程中创建的临时表将自动从被调用过程内部可见(反之亦然)。只需确保其中没有同名的不同临时表即可。

    查看此处了解更多信息和其他选项:

    http://sommarskog.se/share_data.html


    这是一个简化的示例:

    create procedure proc1
    as
    create table #t1(i int)
    insert #t1 values (1)
    exec proc2
    go
    
    create procedure proc2
    as
    select * 
    from #t1
    go
    
    exec proc1
    

    【讨论】:

    • 我对 OP 的更改是否仍然适用于您的答案?我想我没有看到你的建议是如何工作的。
    • 你真的试过这个吗?
    【解决方案2】:

    您可以使用表变量并将其作为参数传递,然后您可以将该表变量作为常规表在另一个SP 中查询。

    DECLARE @t table(
       testid int,
       testfoo int,
       testbar int
    )
    
    select testid, testfoo, testbar
    into @t
    from testtable
    where tid = 2
    
    exec usr_updateTestSP @t
    

    表变量在对大型数据集进行操作时会产生高 I/O。

    【讨论】:

    • usr_updateTestSP 已经存在,并且正在我的代码中的其他地方使用。因此,更改参数不是一种选择。我已更改我的 OP 以更好地反映问题。
    • @dotnetN00b,您可以将 table 变量与您需要的其他参数一起传递。您的问题是消除其他变量的选项。你能修改被调用的SP吗?
    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多