2009-04-22 3 views
2

さて、あなたにはおそらく非常に簡単な質問があります。SQLで#temptableを満たす方法を選択するには?

ある種のブール値Tを与えられた場合、データセットAを使用して一時テーブルを作成したいTが真である場合はデータセットB、Tが偽の場合はデータセットB。

DECLARE @foo INT 
SET @foo = null 

IF (@foo is null) 
    BEGIN 
     SELECT 'foo was null' INTO #TempTable 
    END 
ELSE 
    BEGIN 
     SELECT 'foo not null' INTO #TempTable 
    END 

しかし、これは機能しません。 「データベースに「#TempTable」という名前のオブジェクトが既に存在します」というエラーが表示されます。

明らかに、Sqlは条件を評価する前に、それぞれのケースでテーブルを作成しようとしています...?それは私には奇妙に見えますが、大丈夫です...しかし、これのようなことをする正しい方法は何ですか?

編集:私はSql Serverに属していますが、これはもっと一般的な問題だと思われますが、間違っている場合はお知らせください。

+0

回答が更新されました。もう一度チェックして、テーブルを最初に作成してから値を挿入してみてください。 – Kirtan

答えて

4

あなたが(それは一度実行する必要があります)最初の一時テーブルを作成する必要があります:問題が、その後、

CREATE TABLE #TempTable TABLE (
     message VARCHAR(50) 
) 

DECLARE @foo INT 
SET @foo = null 

IF (@foo is null) 
    BEGIN 
     INSERT 
     INTO #TempTable 
     SELECT 'foo was null' 
    END 
ELSE 
    BEGIN 
     INSERT 
     INTO #TempTable 
     SELECT 'foo not null' 
    END 

おそらくあなたがTEMPORARY TABLEはないしたいが、 TABLE VARIABLE(セッション中のみ存続し、データベーススキーマでは存続しません):

DECLARE @foo INT 
DECLARE @TempTable TABLE (
     message VARCHAR(50) 
     ) 
SET @foo = null 

IF (@foo is null) 
    BEGIN 
     INSERT 
     INTO @TempTable 
     SELECT 'foo was null' 
    END 
ELSE 
    BEGIN 
     INSERT 
     INTO @TempTable 
     SELECT 'foo not null' 
    END 
+1

はい。しかし、大量のデータを扱う際に時々遅くなることがあります。 – Kirtan

+0

これは非常によく役立ちます。私はそれが受け入れられた答えを与える可能性が高い...しかし、それは "select..into"から "insert into..select"へのフォーマットを変更するので、最初の部分は私のためにはうまくいきません。しかし、私は手動でtempテーブルを作成して削除する必要があります。 (これはもちろん、いいです...私はちょうど答えの部分が後世のために更新されているのを見たいと思います)。私は2番目の答えが好きです...私は前にテーブル変数を使用していません...私はそれらについていくつかの研究をする必要があります!素晴らしいよ! – Beska

+0

良い更新。そこに行く。 – Beska

2

テーブルがすでに作成されている場合は、テーブルを最初に削除してから再度挿入する必要があります。

EDIT:あなたが言ったように、そのないテーブルの問題は、データベース内に既に存在している、あなたはこのようにそれをやろうとすることができる -

IF EXISTS (SELECT * FROM sysobjects WHERE object_id = OBJECT_ID(N'#TempTable') 
    DROP TABLE #TempTable 


CREATE TABLE #TempTable (Col1 INT, ...) 

IF TRUE 
BEGIN 
    INSERT INTO #TempTable 
    SELECT VAL1 
END 
ELSE 
BEGIN 
    INSERT INTO #TempTable 
    SELECT VAL2 
END 
+0

Nope。チェック。文が実行される前に表は存在しません。それだけでそこの両方の参照が嫌いです。 refを削除すると問題なく作成されます。 – Beska

1

このことができます参照してください... link

選択文の外にテンポラリテーブルを作成して に挿入し、それに挿入する必要があります。例えば、

CREATE TABLEを#tmp_table AS SELECT * FROM PRODUCTS WHERE 1 = 2

@condition 0 はINSERTの#tmp_table SELECT * FROM製品.... ENDをBEGIN = IF ELSE ....

4

2つの文が存在することを解析ステップが認識しているため、この問題が発生しています。あなたのロジックは一時テーブルが一度しか作成されないように指示しますが、パーサはまだそれについて不平を言っています。

これを回避する方法の1つは、SELECT INTOの後にGO文を使用することですが、条件付きロジックでは機能しません。それ以外の場合は

、単に個別のテーブルを作成し、そのようにそれに挿入:

CREATE TABLE #TempTable (result varchar(50)) 

IF @foo is null 
BEGIN 
    insert into #TempTable values ('foo was null') 
END 
ELSE 
BEGIN 
    insert into #TempTable values('foo was not null') 
END 
5

なぜセット・ベースではなく、手続き型ソリューションは使用しない:読む

SELECT CASE WHEN @foo is null 
      THEN 'foo was null' 
      ELSE 'foo not null' 
     END      AS result 
INTO #TempTable 
+0

非常に良い点。これははるかに少ないコードとはるかに読みやすく、管理しやすくなります。 –

関連する問題