我的情况是这样的,
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内的表变量。还有其他办法可以实现这个目标吗?
答案 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 *