mange gange støder vi på et scenarie, hvor vi skal udføre en kode baseret på, om der findes en tabel eller ej. I denne artikel vil liste de forskellige tilgange, der er almindeligt anvendt, og det er fordele og ulemper. Jeg foretrækker at bruge funktionen OBJECT_ID (), da det er let at huske. Lad mig vide, hvilken tilgang du bruger og grund til det samme.
for at demo disse forskellige tilgange, lad os oprette en prøvedatabase med en tabel ved hjælp af nedenstående script:
CREATE DATABASE SqlHintsDemoDBGOUSE SqlHintsDemoDBGOCREATE TABLE dbo.Customers (CustId INT, Name NVARCHAR(50))
Sådan kontrolleres, om Temp-tabellen findes i
tilgang 1: Brug af INFORMATION_SCHEMA.Tabeller se
vi kan skrive en forespørgsel som nedenfor for at kontrollere, om der findes en Kundetabel i den aktuelle database.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
resultat:
ovenstående forespørgsel kontrollerer eksistensen af Kundetabellen på tværs af alle skemaerne i den aktuelle database. I stedet for dette, hvis du vil kontrollere eksistensen af tabellen i et specificeret skema og den angivne Database, kan vi skrive ovenstående forespørgsel som nedenfor:
IF EXISTS (SELECT * FROM SqlHintsDemoDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
resultat:
fordele ved denne tilgang: INFORMATION_SCHEMA-visninger er bærbare på tværs af forskellige RDBMS-systemer, så porting til forskellige RDBMS kræver ingen ændring.
Sådan kontrolleres, om der findes en gemt Procedure i Server
Approach 2: Brug af OBJECT_ID () – funktion
vi kan bruge OBJECT_ID () – funktion som nedenfor til at kontrollere, om der findes en Kundetabel i den aktuelle database.
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
resultat:
angivelse af databasens navn og Skemanavn dele til tabelnavnet er valgfrit. Men angivelse af Databasenavn og Skemanavn giver mulighed for at kontrollere eksistensen af tabellen i den angivne database og inden for et bestemt skema i stedet for at tjekke den aktuelle database på tværs af alle skemaerne. Nedenstående forespørgsel viser, at selvom den aktuelle database er MASTERDATABASE, kan vi kontrollere eksistensen af Kundetabellen i DBO-skemaet i databasen.
USE MASTERGOIF OBJECT_ID(N'SqlHintsDemoDB.dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
resultat:
fordele: let at huske. Et andet bemærkelsesværdigt punkt at nævne om OBJECT_ID () – funktionen er: det giver mulighed for at kontrollere eksistensen af den midlertidige tabel, der oprettes i den aktuelle forbindelseskontekst. Alle andre tilgange kontrollerer eksistensen af den midlertidige tabel, der er oprettet på tværs af alle forbindelseskonteksten i stedet for kun den aktuelle forbindelseskontekst. Nedenstående forespørgsel viser, hvordan man kontrollerer eksistensen af en midlertidig tabel ved hjælp af OBJECT_ID () – funktion:
CREATE TABLE #TempTable(ID INT)GOIF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'ENDGO
resultat:
Sådan kontrolleres, om der findes en Database i SDL-serveren
tilgang 3: Brug af sys.Objektkatalogvisning
Vi kan bruge Sys.Objektkatalogvisning for at kontrollere eksistensen af tabellen som vist nedenfor:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')BEGIN PRINT 'Table Exists'END
resultat
Sådan kontrolleres, om der findes en post i en tabel
tilgang 4: Brug af sys.Tabeller Katalogvisning
Vi kan bruge Sys.Tabeller katalogvisning for at kontrollere eksistensen af tabellen som vist nedenfor:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')BEGIN PRINT 'Table Exists'END
resultat
Sys.Tabeller katalogvisning arver rækkerne fra Sys.Objekter katalog visning, Sys.objektkatalogvisning kaldes basisvisning hvor som sys.Tabeller kaldes afledt visning. Sys.Tabeller returnerer kun rækkerne for Tabelobjekterne, mens Sys.Objektvisning bortset fra at returnere rækkerne for tabelobjekter, returnerer den rækker for objekterne som: gemt procedure, visninger osv.
Sådan kontrolleres, om der findes en visning i server
Approach 5: undgå at bruge sys.sysobjects Systemtabel
vi bør undgå at bruge sys.sysobjects Systemtabel direkte, direkte adgang til den vil blive udskrevet i nogle fremtidige versioner af serveren. I henhold til Microsoft BOL link foreslår Microsoft at bruge katalogvisningerne sys.objekter / sys.tabeller i stedet for sys.sysobjects system tabel direkte.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')BEGIN PRINT 'Table Exists'END
resultat:
:
Sådan kontrolleres, om der findes en Database
Sådan kontrolleres, om der findes en gemt Procedure i en server
Sådan kontrolleres, om der findes en visning
Sådan kontrolleres, om Temp-tabellen findes
Sådan kontrolleres, om der findes en post i tabellen