Saya menggunakan kode berikut untuk memeriksa apakah tabel sementara ada dan drop 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
BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT
. Jika transaksi berhasil, tabel akan dihapus. Jika gagal, tabel akan hilang juga (karena dibuat dalam transaksi). Dalam hal apa pun: Tidak perlu memeriksa apakah tabel sudah ada.Jawaban:
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:
sumber
'tempdb..#name'
persis apa yang saya butuhkan. Saya menggunakan'dbo.#name'
, seperti orang bodoh. Saya mendapatkantempdb
bagiannya, tetapi ada apa dengan titik ganda?Pernyataan harus sesuai urutan
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'.
sumber
Alih-alih
dropping
dan menciptakan kembali tabel temp yang Anda bisatruncate
dan menggunakannya kembaliJika Anda menggunakan
Sql Server 2016
atauAzure Sql Database
kemudian menggunakan sintaks di bawah ini untuk menjatuhkan tabel temp dan membuatnya kembali. Info lebih lanjut di sini MSDNSintaksis
Pertanyaan:
sumber
truncate/reuse
metode ini akan lebih efisien daripada yangDROP TABLE IF EXISTS
aktifSql Server 2016
danAzure Sql Database
juga. Bukankah ini masalahnya?DROP TABLE IF Exists
untuk SQL 2016 atau Azure? Sintaks tersedia mulai SQL 2008. Lihat tautan MSDN di jawaban Anda? Faktor kinerja?DROP TABLE
didukung dari SQL Server 2008, tetapiIF EXISTS
klausa ini diperkenalkan pada 2016.INTO
: pilih * KE #HistoricoUserTable dari dbo.HistoricoUserSaya 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.sumber
tempdb..
dalam kode di atas sangat penting. Perlu mendahului nama tabel temp Anda. Cukup mengecek sajaOBJECT_ID('#Results')
tidak cukup. Tabel sementara disimpan di database TempDB. Per Microsoft: Basis data sistem TempDB adalah sumber daya global yang tersedia untuk semua pengguna yang terhubung ke instance dari SQL Server atau terhubung ke Database SQLtempdb
atau tidak akan hilang.Ini dapat dilakukan dengan satu baris kode:
sumber
Ini bekerja untuk saya: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
sumber
Hanya sedikit komentar dari pihak saya karena
OBJECT_ID
tidak berhasil untuk saya. Itu selalu mengembalikan itu..even meskipun tidak eksis. Saya baru saja menemukan itu disimpan dengan nama yang berbeda (postfixed oleh
_
garis bawah) seperti:#tempTable________
Ini bekerja dengan baik untuk saya:
sumber
Sekarang Anda dapat menggunakan sintaks di bawah ini jika Anda menggunakan salah satu versi baru dari SQL Server (2016+).
sumber
Incorrect syntax near the keyword 'IF'.
IF [NOT] EXISTS
klausul tersedia dari SQL Server 2016. Tidak peduli versi yang SSMS Anda gunakan.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 persis Anda sehingga kami dapat melihat apa yang sedang terjadi.
sumber
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.
sumber
Saya baru-baru ini melihat DBA melakukan sesuatu yang mirip dengan ini:
sumber
Kode saya menggunakan
Source
tabel yang berubah, danDestination
tabel yang harus cocok dengan perubahan itu.sumber
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 mengirimkan string sql, 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.
sumber
Saat Anda mengubah kolom di tabel temp, Anda harus menjatuhkan tabel sebelum menjalankan kueri lagi. (Ya, itu menjengkelkan. Hanya apa yang harus Anda lakukan.)
Saya selalu berasumsi ini karena pemeriksaan "kolom tidak valid" dilakukan oleh parser sebelum kueri dijalankan, jadi didasarkan pada kolom dalam tabel sebelum dijatuhkan ..... dan itulah yang juga dikatakan pnbs.
sumber