Mengapa sesuatu seperti ini tidak berhasil?
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Saya hanya memeriksa apakah kolom ada, namun, SQL Server mengeluh tentang Somecol
tidak ada. Apakah ada alternatif untuk ini dalam satu pernyataan?
sql-server
t-sql
Carson Reinke
sumber
sumber
CASE
pernyataan.INFORMATION_SCHEMA
bisa berfungsi sebagai solusi.Jawaban:
Permintaan berikut menggunakan ide yang sama seperti dalam jawaban yang luar biasa ini oleh ypercube :
Ini berfungsi seperti ini:
jika
dbo.Customers
memiliki kolom bernamaSomeCol
, makaSomeCol
diSomeCol AS MyTest
akan menyelesaikan sebagaidbo.Customers.SomeCol
;jika tabel tidak memiliki kolom seperti itu, referensi masih akan valid, karena sekarang akan diselesaikan sebagai
dummy.SomeCol
:dummy
kolom dapat dirujuk dalam konteks itu.Anda dapat menentukan beberapa kolom "cadangan" dengan cara itu. Triknya adalah tidak menggunakan alias tabel untuk kolom tersebut (yang merupakan praktik yang disukai di sebagian besar situasi, tetapi dalam hal ini menghilangkan alias tabel membantu Anda untuk menyelesaikan masalah).
Jika tabel digunakan dalam gabungan dan tabel lainnya memiliki tabel sendiri
SomeCol
, Anda mungkin perlu menggunakan kueri di atas sebagai tabel turunan sebelum menggunakannya dalam gabungan agar trik tetap berfungsi, seperti ini:sumber
Salah satu cara untuk melakukan ini adalah dengan memeriksa keberadaan kolom, kemudian membangun SQL dinamis berdasarkan pada apakah kolom itu ada atau tidak.
Tanpa Dynamic SQL, SQL Server akan mencoba untuk mengevaluasi apakah kolom ada atau tidak bahkan sebelum mengeksekusi statment, yang mengakibatkan kesalahan.
Namun, itu berarti Anda akan memiliki 2 pertanyaan untuk ditulis dan berpotensi berubah di masa mendatang. Tapi saya tidak percaya Anda harus benar-benar menargetkan
SELECT
pernyataan pada kolom yang mungkin tidak ada.sumber
Anda dapat menggunakan beberapa XML untuk kueri kolom yang mungkin ada di tabel.
Buat XML dari semua kolom per baris dalam tanda silang, terapkan dan ekstrak nilainya menggunakan
values()
fungsi.Dalam kueri ini ID dikenal sehingga dapatkan langsung dari tabel. Col1 dan Col2 mungkin ada atau tidak jadi buat mereka menggunakan XML.
SQL Fiddle
sumber
Pendekatan saya hanya berbeda sedikit dari yang lain. Saya lebih suka menggunakan sistem untuk ini dan hanya mendapatkan hitungan karena Anda dapat menetapkan jumlah kolom ke variabel di bagian atas kueri dan kemudian memilih untuk melanjutkan atau tidak berdasarkan itu. Kelemahannya adalah ... jika Anda memiliki nama kolom yang sama di beberapa tabel, Anda tidak yakin bahwa kolom ada di tabel yang ingin Anda kueri. Namun, teknik ini juga berfungsi pada tabel tertentu, karena Anda hanya ingin mendapat hitungan.
'Kesulitan' dengan memintanya secara khusus adalah - masalah yang Anda alami. Secara umum, jika nilai NULL menyebabkan masalah Anda ... temukan cara lain untuk memverifikasi keberadaan. Ini adalah salah satu cara untuk melakukan itu tanpa membahayakan server.
sumber
sysobjects
juga dalam kueri Anda untuk memeriksa apakah tabel spesifik memiliki kolom seperti itu?SELECT 1 ...
juga tidak salah.EXISTS (SELECT ...)
biasanya lebih cepat daripada(SELECT COUNT(*) ...)
, bukan sebaliknya.Jika saya memahaminya dengan benar ...
Anda dapat menggunakan kueri sesuatu seperti di bawah ini dan bertindak sesuai berdasarkan hitungan ... Jika jumlah tersebut> 1 maka itu berarti Anda memiliki col di tabel itu, dan jumlah = 0 maka Anda tidak memiliki col di situ meja
Hitung SELECT (*)
DARI INFORMATION_SCHEMA.COLUMNS DI MANA COLUMN_NAME DALAM ('Id')
DAN TABLE_SCHEMA = 'dbo' dan TABLE_NAME = 'UserBase';
sumber