从过程中只选择几列并插入表中

时间:2013-03-24 06:21:54

标签: sql sql-server sql-server-2008 azure-sql-database

我有一个返回6列的存储过程。但我想只需要2列并将它们插入到我的表变量中。

DECLARE @CategoryTable TABLE(   
CategoryId Int NOT NULL,   
Name nvarchar(255) NOT NULL   
)  

INSERT INTO @CategoryTable EXEC [GetAllTenantCategories] @TenantId  

当我运行时

  

列名或提供的值数与表不匹配   定义

如何仅从存储过程中插入指定的列?

我不想使用SELECT INTO,因为SQL Azure不支持

在下面尝试并获得Invalid object name '#Temp'

DECLARE @CategoryTable TABLE(   
CategoryId Int NOT NULL,   
Name nvarchar(255) NOT NULL   
)  
INSERT INTO #Temp EXEC [GetAllTenantCategories] 1 

INSERT INTO @CategoryTable (CategoryId, Name) 
SELECT CategoryId, Name from #Temp

DROP TABLE #Temp

3 个答案:

答案 0 :(得分:1)

您可以先在temp中创建INSERT表,并在table variable中创建CREATE TABLE #temp ( your columns and datatype ) INSERT INTO #temp EXEC [GetAllTenantCategories] @TenantId 所需的列。

DECLARE @CategoryTable TABLE(   
 CategoryId Int NOT NULL,   
 Name nvarchar(255) NOT NULL   
 )  

INSERT INTO @CategoryTable (CategoryId, Name)
select CategoryId, Name from #temp

然后你可以,

DROP TABLE #temp

同时删除#temp表,

{{1}}

答案 1 :(得分:1)

参考https://www.simple-talk.com/sql/performance/execution-plan-basics/

取得的分数

当估算计划无效时

在某些情况下,估计的计划根本不起作用。例如,尝试为这段简单的代码生成估计计划:

CREATE TABLE TempTable
(
Id INT IDENTITY (1 , 1 )
,Dsc NVARCHAR (50 )
);

INSERT INTO TempTable ( Dsc )
SELECT [Name]
FROM [Sales] .[Store] ;

SELECT *
FROM TempTable ;

DROP TABLE TempTable ;

您将收到此错误:

Invalid object name 'TempTable'.

优化器,用于生成估计执行计划,不执行T-SQL。

它通过algebrizer运行语句,前面概述的过程负责验证数据库对象的名称。由于尚未执行查询,因此临时表尚不存在。这是错误的原因。

Running this same bit of code through the Actual execution plan will work perfectly fine.

希望你知道为什么你的临时表方法不起作用:)因为你可能尝试过T-SQL

答案 2 :(得分:0)

我们可以使用 OPENQUERY

SELECT EmployeeID,CurrentSalary INTO #tempEmp 
FROM OPENQUERY(LOCALSERVER,'Exec TestDB.dbo.spEmployee')

请参阅此处http://smartreferences.blogspot.com/2014/12/insert-result-of-stored-procedure-into.html