2009-04-03 14 views
5

SQL Serverは、テンポラリテーブルがすでに存在すると主張しているのはなぜですか?どちらか一方が起こります! 、それは決してそうではありません。IF .. ELSEステートメントでのテンポラリテーブルの使用

declare @checkvar varchar(10) 
declare @tbl TABLE(colx varchar(10)) 
set @checkvar ='a' 

INSERT INTO @tbl (colx) VALUES('a') 
INSERT INTO @tbl (colx) VALUES('b') 
INSERT INTO @tbl (colx) VALUES('c') 
INSERT INTO @tbl (colx) VALUES('d') 

IF @checkvar is null select colx INTO #temp1 FROM @tbl 
ELSE select colx INTO #temp1 FROM @tbl WHERE colx [email protected] 

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

これには優雅な方法がありますか? @checkvarがnullの場合は、テーブル全体が必要です @checkvar = something

EDIT:列はintではなくvarcharです。

答えて

5

文を書き直すことはできませんか?

SELECT colx INTO #temp1 FROM @tbl WHERE (@checkvar IS NULL) OR (colx = @checkVar) 
+0

[OK]をクリックします。私の提案を変更しました –

2
drop table #temp1 

select colx into #temp1 
from @tbl 
where (ISNULL(@checkvar,'0')='0' or [colx] = @checkvar) 

@checkvarが存在する場合はelse文は、それはすべてのデータが返される場所、それがこれを使用します。 @checkvarの初期値にならない限り、あなたが望むものに '0'を変更することができます。

+0

卑劣なことに、トリックを行う限り、ステートメントを0 = 0 –

+0

にトリックします:) – Peter

3

これがストアドプロシージャの場合、SELECT .. INTOはプロシージャの再コンパイルを行います。

私が理解したところでは、プロシージャの先頭にテーブルを作成し、後で通常のINSERTを実行する方がよいでしょう。だから、

、Idはお勧め:

CREATE TABLE #temp1 (colx ...) 

DECLARE @checkvar VARCHAR(10) 
DECLARE @tbl TABLE(colx varchar(10)) 
SET @checkvar ='a' 

INSERT INTO @tbl (colx) VALUES('a') 
INSERT INTO @tbl (colx) VALUES('b') 
INSERT INTO @tbl (colx) VALUES('c') 
INSERT INTO @tbl (colx) VALUES('d') 

IF @checkvar IS NULL 
BEGIN 
    INSERT INTO #temp1(colx) 
    SELECT colx 
    FROM @tbl 
END 
ELSE 
BEGIN 
    INSERT INTO #temp1(colx) 
    SELECT colx 
    FROM @tbl WHERE colx [email protected] 
END 

はまた、あなたがまたは他の溶液が言及を取り除くこの方法(ORさんは悪です;)

/B

6

あなたが作成することができますWHERE 1=0を使用して、目的の構造の空の一時テーブルを作成します。次に元のコードで希望のレコードを挿入します

SELECT colx INTO #temp1 
FROM @tbl 
WHERE 1 = 0 // this is never true 

IF @checkvar IS NULL 
BEGIN 
    INSERT INTO #temp1 (colName) 
    SELECT colx FROM @tbl 
END 
ELSE 
BEGIN 
    INSERT INTO #temp1 (colName) 
    SELECT colx 
    FROM @tbl 
    WHERE colx = @checkvar 
END 
関連する問題