【问题标题】:Select only few columns from procedure and insert into table从过程中仅选择几列并插入表中
【发布时间】:2013-03-24 06:21:53
【问题描述】:

我有一个返回 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

【问题讨论】:

  • 您必须更改 @CategoryTable 或 GetAllTenantCategories
  • @bummi,我更改了@CategoryTable,定义了所有 6 列。我仍然收到Column name or number of supplied values does not match table definition
  • @bummi,这是我的错误,在更改 @CategoryTable 时,我添加了一个带有 IDENTITY(1,1) 指定的列 :(

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


【解决方案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】:

您可以先创建temp 表,然后在table variable 中创建INSERT 所需的列。

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

同时删除#temp 表,

DROP TABLE #temp

【讨论】:

  • 当我运行它说Invalid object name '#CategoryTable'
  • 您需要像在问题中声明的那样声明表@CategoryTable ....查看我的更新
  • DECLARE @CategoryTable TABLE( CategoryId Int NOT NULL, Name nvarchar(255) NOT NULL ) INSERT INTO #Temp EXEC [GetAllTenantCategories] @TenantId INSERT INTO @CategoryTable (CategoryId, Name) SELECT CategoryId, Name from #temp DROP TABLE #temp
  • 我再次粘贴了我的代码。它说Invalid object name #Temp。我需要声明#Temp 吗?
  • 看起来很愚蠢的错误......我们插入#Temp......用大写T,现在v r试图访问#temp......SMALLER CASE T
【解决方案3】:

我们可以使用OPENQUERY

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2015-12-13
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多