如何将表变量从一个存储过程传递到另一个存储过程

时间:2014-08-24 09:36:05

标签: sql sql-server sql-server-2008 sql-server-2005 stored-procedures

我的情况是这样的,

CREATE PROCEDURE SP_1
AS 
BEGIN
    INSERT INTO #tmpTable(ID, Value)
    VALUES(1, 1), (2, 2)
END
GO

CREATE PROCEDURE SP_2
AS
BEGIN
    CREATE TABLE #tmpTable(ID INT, Value INT)
    EXEC SP_1

    SELECT * FROM #tmpTable

    DROP TABLE #tmpTable
END
GO

EXEC SP_2
GO

DROP PROCEDURE SP_1
DROP PROCEDURE SP_2

我想将#表替换为TABLE VARIABLE@表)。

我试图将表变量作为参数传递给SP_1,但我应该将表变量作为只读参数传递。由于它是只读的,我不能插入SP_1内的表变量。还有其他办法可以实现这个目标吗?

3 个答案:

答案 0 :(得分:1)

这不会以这种方式工作。您应该将查询封装在字符串中。完成后,您可以根据需要更改表名称。然后,使用EXEC sp_executesql执行 我之前回答过类似的问题,可以在下面找到:
SQL: How to make table name in stored procedure dynamic
这是我提供的例子

declare @sql nvarchar(max)
    declare @TableName nvarchar(max)
    set @TableName = 'mytable'
    set @sql = 'Select * from ' + @TableName
    Exec sp_executesql @sql

答案 1 :(得分:0)

这对我有用(Sql server 2012),虽然我并不完全理解你想要实现的目标:

CREATE PROCEDURE SP_1
AS 
BEGIN

    Create table #tmpTable (ID INT, Value INT)

    INSERT INTO #tmpTable(ID, Value)
    VALUES(1, 1), (2, 2)

    Select ID,Value from #tmpTable
END
GO

CREATE PROCEDURE SP_2
AS
BEGIN
    Declare @tmpTable table (ID INT, Value INT)

    Insert into @tmpTable
    EXEC SP_1

    SELECT * FROM @tmpTable


END
GO

EXEC SP_2
GO

DROP PROCEDURE SP_1
DROP PROCEDURE SP_2

答案 2 :(得分:0)

我更喜欢将数据作为[xml]传递。与我合作更容易。您可以构建类似于下面代码的记录集,并在您的过程之间传递[xml]参数,然后如图所示解析它。

声明@record_list [XML] =(SELECT *
从[SYS]。[对象]
用于XML路径(N'record '),根(N'record_list'));
选择@record_list;
选择t.c.value(N '(./ schema_id /文本())[1]',N '[数据类型为sysname]')为[schema_id]
,t.c.value(N '(./名/文本())[1]',N '[数据类型为sysname]')为[名称]
,t.c.value(N '(./的object_id /文本())[1]',N '[数据类型为sysname]')为[的object_id]
从@ record_list.nodes(N '/ record_list /记录')为T(℃);