it-swarm.asia

Periksa apakah tabel sementara ada dan hapus jika ada sebelum membuat tabel sementara

Saya menggunakan kode berikut untuk memeriksa apakah tabel sementara ada dan letakkan tabel jika ada sebelum membuat lagi. Ini berfungsi dengan baik selama saya tidak mengubah kolom. Jika saya menambahkan kolom nanti, itu akan memberikan kesalahan mengatakan "kolom tidak valid". Tolong beri tahu saya apa yang saya lakukan salah.

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
573
Sridhar

Saya tidak dapat mereproduksi kesalahan.

Mungkin saya tidak mengerti masalahnya.

Berikut ini berfungsi dengan baik untuk saya di SQL Server 2005, dengan kolom "foo" tambahan muncul di hasil pilih kedua:

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
641
pmac72

Pernyataan harus sesuai urutan

  1. Ubah pernyataan untuk tabel
  2. PERGI
  3. Pilih pernyataan.

Tanpa 'GO' di antaranya, semuanya akan dianggap sebagai satu skrip tunggal dan ketika pernyataan pilih mencari kolom, itu tidak akan ditemukan.

Dengan 'GO', itu akan mempertimbangkan bagian dari skrip hingga 'GO' sebagai satu batch tunggal dan akan dieksekusi sebelum masuk ke permintaan setelah 'GO'.

68
SDS

Alih-alih dropping dan menciptakan kembali tabel temp Anda dapat truncate dan menggunakannya kembali

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

Jika Anda menggunakan Sql Server 2016 atau Azure Sql Database maka gunakan sintaks di bawah ini untuk menjatuhkan tabel temp dan membuatnya kembali. Info lebih lanjut di sini MSDN

Sintaks

DROP TABEL [JIKA ADA] [database_name. [schema_name]. | schema_name. ] table_name [ ... n]

Permintaan:

DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )
48
Pரதீப்

Saya pikir masalahnya adalah Anda perlu menambahkan pernyataan GO di antara untuk memisahkan eksekusi menjadi batch. Sebagai skrip drop kedua yaitu IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results tidak menjatuhkan tabel temp menjadi bagian dari batch tunggal. Bisakah Anda mencoba skrip di bawah ini.

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

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

GO

select company, stepid, fieldid from #Results

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

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

GO

select company, stepid, fieldid, NewColumn from #Results
46
vikas

Ini bekerja untuk saya: 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;
27
user219628

Hanya sedikit komentar dari pihak saya karena OBJECT_ID tidak berfungsi untuk saya. Itu selalu mengembalikan itu

`#tempTable tidak ada

..bahkan meskipun tidak ada. Saya baru saja menemukan itu disimpan dengan nama yang berbeda (postfixed oleh _ garis bawah) seperti:

#tempTable________

Ini bekerja dengan baik untuk saya:

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;
15
Ivan Sivak

pmac72 menggunakan GO untuk memecah kueri menjadi batch dan menggunakan ALTER.

Anda tampaknya menjalankan batch yang sama tetapi menjalankannya dua kali setelah mengubahnya: DROP ... CREATE ... edit ... DROP ... CREATE ..

Mungkin memposting kode tepat Anda sehingga kami dapat melihat apa yang sedang terjadi.

10
gbn

Saya biasanya menemukan kesalahan ini ketika saya sudah membuat tabel temp; kode yang memeriksa pernyataan SQL untuk kesalahan melihat tabel temp "lama" di tempat dan mengembalikan salah hitung pada jumlah kolom dalam pernyataan kemudian, seolah-olah tabel temp tidak pernah dijatuhkan.

Setelah mengubah jumlah kolom dalam tabel temp setelah membuat versi dengan lebih sedikit kolom, letakkan tabel dan MAKA jalankan kueri Anda.

6
Jacob Griffin

Saya baru-baru ini melihat DBA melakukan sesuatu yang mirip dengan ini:

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)
4
anonxen

Sekarang Anda dapat menggunakan sintaks di bawah ini jika Anda menggunakan salah satu versi SSMS baru

DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)
4

Kode saya menggunakan tabel Source yang berubah, dan tabel Destination yang harus cocok dengan perubahan itu.

-- 
-- 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
3
Mike Lewis

Ya, "kolom tidak valid" kesalahan ini muncul dari baris "pilih perusahaan, stepid, fieldid, Kolom Baru dari #Hasil".

Ada dua fase menjalankan t-sql,

pertama, parsing, dalam fase ini server sql memeriksa koreksi dari Anda string sql yang Anda kirimkan, termasuk kolom tabel, dan dioptimalkan permintaan Anda untuk retreival tercepat.

kedua, menjalankan, menerima kembali data.

Jika tabel #Hasil ada maka proses penguraian akan memeriksa kolom yang Anda tentukan valid atau tidak, jika tidak (tabel tidak ada) penguraian akan dengan melewati kolom pemeriksaan seperti yang Anda tentukan.

0
pnbps

Ini dapat dilakukan dengan satu baris kode:

IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL DROP TABLE #tempTableName;   
0
S Krishna