730

次のコードを使用して、一時テーブルが存在するかどうかを確認し、存在する場合はテーブルを削除してから再度作成しています。列を変更しない限り、正常に動作します。後で列を追加すると、「無効な列」というエラーが表示されます。私が間違っていることを教えてください。

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
)

select company, stepid, fieldid from #Results

--Works fine to this point

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
    NewColumn            NVARCHAR(50)
)

select company, stepid, fieldid, NewColumn from #Results

--Does not work
4

16 に答える 16

792

エラーを再現できません。

おそらく私は問題を理解していません。

以下は、SQL Server 2005 で問題なく動作し、2 番目の選択結果に追加の「foo」列が表示されます。

IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
于 2009-03-20T00:28:56.663 に答える
101

ステートメントは次の順序である必要があります

  1. テーブルのステートメントを変更します
  2. 行く
  3. ステートメントを選択します。

間に「GO」がないと、すべてが1つのスクリプトと見なされ、selectステートメントが列を検索しても見つかりません。

「GO」を使用すると、「GO」までのスクリプトの部分が1つのバッチと見なされ、「GO」の後にクエリに入る前に実行されます。

于 2011-08-25T09:03:12.957 に答える
81

dropping一時テーブルを再作成する代わりに、再truncate利用できます

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    Truncate TABLE #Results
else
    CREATE TABLE #Results
    (
        Company             CHAR(3),
        StepId              TINYINT,
        FieldId             TINYINT,
    )

使用している場合、Sql Server 2016またはAzure Sql Database以下の構文を使用して一時テーブルを削除し、再作成します。詳細はこちらMSDN

構文

DROP TABLE [存在する場合] [データベース名。[スキーマ名] . | | schema_name 。] テーブル名 [ ,...n ]

クエリ:

DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )
于 2015-12-13T04:56:47.073 に答える
29

これは私にとってはうまくいきました: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required

if exists (
    select  * from tempdb.dbo.sysobjects o
    where o.xtype in ('U') 

   and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;
于 2012-08-31T20:51:31.630 に答える
21

OBJECT_ID私にはうまくいかないので、私の側からのちょっとしたコメント。それは常にそれを返します

`#tempTable が存在しません

..それ存在しますが。次のように、別の名前(アンダースコアで後置)で保存されていることがわかりました_

#tempTable________

これは私にとってはうまくいきます:

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;
于 2014-06-06T22:14:13.823 に答える
10

pmac72は、GO を使用してクエリをバッチに分割し、ALTER を使用しています。

同じバッチを実行しているように見えますが、変更後に 2 回実行しています: DROP... CREATE... edit... DROP... CREATE..

おそらく正確なコードを投稿して、何が起こっているのかを確認してください。

于 2009-03-21T12:16:40.073 に答える
10

これは私のために働いた、

IF OBJECT_ID('tempdb.dbo.#tempTable') IS NOT NULL 
DROP TABLE #tempTable; 

ここでtempdb.dbo(dboはスキーマに他なりません)がより重要になっています。

于 2020-07-10T07:33:58.373 に答える
7

通常、一時テーブルを既に作成しているときにこのエラーが発生します。SQL ステートメントのエラーをチェックするコードは、一時テーブルが削除されなかったかのように、「古い」一時テーブルが配置されていることを確認し、後のステートメントで列数のミスカウントを返します。

列数の少ないバージョンを作成した後で一時テーブルの列数を変更したら、テーブルを削除してクエリを実行します。

于 2010-03-17T17:53:40.847 に答える
3

私のコードでは、Source変更されるテーブルと、Destinationそれらの変更に一致する必要があるテーブルを使用しています。

-- 
-- Sample SQL to update only rows in a "Destination" Table
--  based on only rows that have changed in a "Source" table
--


--
-- Drop and Create a Temp Table to use as the "Source" Table
--
IF OBJECT_ID('tempdb..#tSource') IS NOT NULL drop table #tSource
create table #tSource (Col1 int, Col2 int, Col3 int, Col4 int)

--
-- Insert some values into the source
--
Insert #tSource (Col1, Col2, Col3, Col4) Values(1,1,1,1)
Insert #tSource (Col1, Col2, Col3, Col4) Values(2,1,1,2)
Insert #tSource (Col1, Col2, Col3, Col4) Values(3,1,1,3)
Insert #tSource (Col1, Col2, Col3, Col4) Values(4,1,1,4)
Insert #tSource (Col1, Col2, Col3, Col4) Values(5,1,1,5)
Insert #tSource (Col1, Col2, Col3, Col4) Values(6,1,1,6)

--
-- Drop and Create a Temp Table to use as the "Destination" Table
--
IF OBJECT_ID('tempdb..#tDest') IS NOT NULL drop Table #tDest
create table #tDest (Col1 int, Col2 int, Col3 int, Col4 int)

--
-- Add all Rows from the Source to the Destination
--
Insert #tDest
Select Col1, Col2, Col3, Col4 from #tSource


--
-- Look at both tables to see that they are the same
--
select *
from #tSource
Select *
from #tDest

--
-- Make some changes to the Source
--
update #tSource
    Set Col3=19
    Where Col1=1
update #tSource
    Set Col3=29
    Where Col1=2
update #tSource
    Set Col2=38
    Where Col1=3
update #tSource
    Set Col2=48
    Where Col1=4

--
-- Look at the Differences
-- Note: Only 4 rows are different. 2 Rows have remained the same.
--
Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest

--
-- Update only the rows that have changed
-- Note: I am using Col1 like an ID column
--
Update #tDest
    Set Col2=S.Col2,
        Col3=S.Col3,
        Col4=S.Col4
From    (   Select Col1, Col2, Col3, Col4
            from #tSource
            except
            Select Col1, Col2, Col3, Col4
            from #tDest
        ) S
Where #tDest.Col1=S.Col1 

--
-- Look at the tables again to see that
--  the destination table has changed to match
--  the source table.

select *
from #tSource
Select *
from #tDest

--
-- Clean Up
--
drop table #tSource
drop table #tDest
于 2016-05-09T19:54:18.840 に答える