de multe ori întâlnim un scenariu în care trebuie să executăm un cod bazat pe existența sau nu a unui tabel. Există diferite moduri de a identifica existența tabel în Sql Server, în acest articol va lista din diferite abordări care sunt utilizate în mod obișnuit și este argumente pro și contra. Prefer să folosesc funcția OBJECT_ID (), deoarece este ușor de reținut. Spuneți-mi ce abordare utilizați și motivul pentru același lucru.
pentru a demonstra aceste abordări diferite, să creăm o bază de date eșantion cu un tabel după scriptul de mai jos:
CREATE DATABASE SqlHintsDemoDBGOUSE SqlHintsDemoDBGOCREATE TABLE dbo.Customers (CustId INT, Name NVARCHAR(50))
cum să verificați dacă tabelul Temp există în Sql Server?
abordarea 1: Utilizarea INFORMATION_SCHEMA.Vizualizare tabele
putem scrie o interogare ca mai jos pentru a verifica dacă există un tabel clienți în baza de date curentă.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
rezultat:
interogarea de mai sus verifică existența tabelului clienți în toate schemele din Baza de date curentă. În loc de aceasta, dacă doriți să verificați existența tabelului într-o schemă specificată și baza de date specificată, atunci putem scrie interogarea de mai sus ca mai jos:
IF EXISTS (SELECT * FROM SqlHintsDemoDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
rezultat:
avantajele acestei abordări: Vizualizările INFORMATION_SCHEMA sunt portabile în diferite sisteme RDBMS, astfel încât portarea la diferite RDBMS nu necesită nicio modificare.
cum se verifică dacă există o procedură stocată în Sql Server
abordarea 2: Folosind funcția OBJECT_ID ()
putem folosi funcția OBJECT_ID() ca mai jos pentru a verifica dacă există un tabel clienți în baza de date curentă.
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
rezultat:
specificarea numelui bazei de date și a pieselor de nume ale schemei pentru numele tabelului este opțională. Dar specificarea numelui bazei de date și a numelui schemei oferă o opțiune pentru a verifica existența tabelului în baza de date specificată și într-o schemă specificată, în loc să verificați baza de date curentă în toate schemele. Interogarea de mai jos arată că, chiar dacă baza de date curentă este baza de date MASTER, putem verifica existența tabelului clienți în schema dbo în baza de date sqlhintsdemodb.
USE MASTERGOIF OBJECT_ID(N'SqlHintsDemoDB.dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
rezultat:
Pro: Ușor de reținut. Un alt punct notabil de menționat despre funcția OBJECT_ID () este: oferă o opțiune pentru a verifica existența tabelului temporar care este creat în contextul actual al conexiunii. Toate celelalte abordări verifică existența tabelului temporar creat în contextul tuturor conexiunilor în loc de doar contextul actual al conexiunii. Interogarea de mai jos arată cum să verificați existența unui tabel temporar folosind funcția OBJECT_ID ():
CREATE TABLE #TempTable(ID INT)GOIF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'ENDGO
rezultat:
cum să verificați dacă există o bază de date în Sql Server
abordarea 3: Utilizarea sys.Vizualizarea Catalogului de obiecte
putem folosi sistemul.Vizualizarea Catalogului de obiecte pentru a verifica existența tabelului așa cum se arată mai jos:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')BEGIN PRINT 'Table Exists'END
rezultat
cum se verifică dacă există o înregistrare într-un tabel
abordarea 4: Utilizarea sistemului.Vizualizarea Catalogului tabelelor
putem folosi sistemul.Vizualizarea Catalogului tabelelor pentru a verifica existența tabelului așa cum se arată mai jos:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')BEGIN PRINT 'Table Exists'END
rezultat
Sys.Vizualizarea catalog tabele moștenește rândurile din Sys.Vizualizare catalog obiecte, Sys.vizualizarea Catalogului de obiecte este denumită vizualizare de bază unde este sys.Tabele este menționată ca vizualizare derivate. Sys.Tabelele vor returna rândurile numai pentru obiectele de masă în timp ce Sys.Vizualizare obiect în afară de returnarea rândurilor pentru obiecte de masă, returnează rânduri pentru obiecte precum: procedură stocată, vizualizări etc.
cum se verifică dacă există o vizualizare în Sql Server
abordarea 5: evitați utilizarea sys.tabelul de sistem sysobjects
ar trebui să evităm utilizarea sys.tabelul de sistem sysobjects direct, accesul direct la acesta va fi depreciat în unele versiuni viitoare ale serverului Sql. Ca pe link-ul Microsoft BOL, Microsoft sugerează să utilizeze vizualizările catalogului SYS.obiecte/sys.tabele în loc de sys.tabelul de sistem sysobjects direct.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')BEGIN PRINT 'Table Exists'END
rezultat:
:
Cum să verificați dacă există o bază de Date
Cum să verificați dacă există o procedură stocată în Sql Server
Cum să verificați dacă există o vizualizare
Cum să verificați dacă există un tabel Temp
Cum să verificați dacă există o înregistrare în tabel