2

6列を返すストアドプロシージャがあります。しかし、2つの列だけを取得して、それらをテーブル変数に挿入したいと思います。

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

INSERT INTO @CategoryTable EXEC [GetAllTenantCategories] @TenantId  

これを実行すると

列名または指定された値の数がテーブル定義と一致しません

ストアドプロシージャから指定された列のみを挿入するにはどうすればよいですか?

SELECT INTOSQL 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
4

3 に答える 3

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

また、#tempテーブルを削除します。

DROP TABLE #temp
于 2013-03-24T06:27:48.423 に答える
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として試した可能性があるため

于 2013-03-27T12:31:33.177 に答える
1

OPENQUERYを使用できます

SELECT EmployeeID,CurrentSalary INTO #tempEmp 
FROM OPENQUERY(LOCALSERVER,'Exec TestDB.dbo.spEmployee')
于 2014-12-20T13:30:31.987 に答える