2011-12-29 10 views
0

私は以下のストアドプロシージャを記述しました。 2つのテンポラリテーブルを作成する必要があります。 最初のテンポラリテーブルでは、私はカーソルを使用してIDを取得しているし、いくつかのクエリに基づいて2番目のテンポラリテーブルに挿入する必要があります。しかし、私は以下のエラーを取得します。 。 この状況で助けが必要です1つのストアドプロシージャで2つのテンポラリテーブルを作成するときに問題があります

データベースには、すでに「TempTable」という名前のオブジェクトがあります。

ALTER PROCEDURE [dbo].[GetDocumentByTrackID] 

@idList nvarchar(50) 

AS 
BEGIN 

SET NOCOUNT ON; 
DECLARE @TrackId INT 

--Temprary表1

CREATE TABLE TempTable(
ID INT 
) 

DECLARE @GetNextRecord cursor 
INSERT INTO TempTable SELECT Value from dbo.fn_sqllist_to_table(@idList,';') 

--Temprary表2

Create TABLE TracksNameID 
(
ID INT, 
Name nvarchar(100) 
) 

SET @GetNextRecord = cursor for select ID from TempTable 

open @GetNextRecord 
FETCH FROM @GetNextRecord into @TrackId 
while @@FETCH_STATUS = 0 
BEGIN 
INSERT INTO TracksNameID 
SELECT ID ,Name FROM dbo.TestTable 
WHERE dbo.TestTable.TrackID = @TrackId 
END 
FETCH FROM @GetNextRecord into @TrackId 
DROP TABLE TempTable 
END 
+0

これは一時テーブルではありません。なぜこの '挿入 'のためにカーソルを使用していますか? –

+0

ああ私は間違いを犯した。 カーソルの使用私はクエリを実行して2番目のテーブルに値を挿入しています。それは考えです。 – Shah

+0

あなたは 'INSERT INTO TracksNameID SELECT ID、名前からdbo.TestTable tジョインdbo.fn_sqllist_to_table(@ idList、 ';')f ON t.TrackID = f.Value'を実行して、 '#temp'テーブルやカーソル。 –

答えて

2

これらは実際にはテーブルではなく、実際のテーブルオブジェクトを作成しています。ストアドプロシージャがどこかで失敗すると、テーブルは削除されません。テーブル変数とのより良いスティック:(それは)テーブルのような

DECLARE @tableName TABLE (
    id int, ...) 

と使用@tableName。これにより、すべてがストアドプロシージャのローカルスコープにバインドされます。

テンポラリテーブルに対するテーブル変数の欠点は、クラスタ化インデックスの欠如であり、ALTERテーブル変数は使用できません。

+0

ああ!私はその間違いをした。たとえこれが正規のテーブルであっても。 1つ以上作成できないことを意味します – Shah

+0

いいえ、テーブル名はデータベース内で一意である必要があります。それ以外の場合は、テーブル名がデータベース内に複数存在すると、テーブルを含む文を解決できませんでした。しかし、データベースに存在しない限り、必要な数だけテーブルを作成することができます。一時表と表変数についても同様です。 – Matten

+1

可変テーブルにはクラスタードインデックスがあります –

1

あなたが定期的にテーブルを作成し、一時テーブル名が#

てみてくださいで始める必要があります#TempTableと#TracksNameIDを作成する

関連する問題