T-SQL inkluderar inte CREATE TABLE
uttalande, som vissa andra DBMS:er gör.
Därför, om vi vill kontrollera om tabellen finns innan vi skapar den i SQL Server, måste vi använda andra metoder.
Alternativ 1:Kontrollera objekt-ID:t
I SQL Server kan vi använda OBJECT_ID()
funktion för att kontrollera om tabellen finns innan vi försöker skapa den:
IF OBJECT_ID(N'dbo.t1', N'U') IS NULL
CREATE TABLE dbo.t1 (
c1 int,
c2 varchar(10)
);
GO
Exemplet ovan kontrollerar objekt-ID för en dbo.t1
bord.
Det andra argumentet till OBJECT_ID()
anger vilken typ av objekt vi letar efter. I det här fallet använder vi U
, vilket är för "användardefinierad tabell".
OBJECT_ID()
returnerar databasobjektets identifieringsnummer för ett objekt med schemaomfattning. Om objektet inte finns, eller om du inte har tillgång till det, returnerar funktionen NULL. Därför kan vi leta efter ett NULL-värde och bara skapa tabellen om denna funktion returnerar NULL.
Vi kan använda OBJECT_ID()
funktion för att kontrollera tabellens objekt-ID när den har skapats:
SELECT OBJECT_ID(N'dbo.t1', N'U');
Exempelresultat:
354100302
Om vi ville ha lite mer information kunde vi göra något så här:
sp_tables 't1';
Resultat:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | KrankyKranes | dbo | t1 | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Här, KrankyKranes
är databasen som jag skapade tabellen i.
Det finns många andra sätt att se på befintliga tabeller. Se 6 sätt att kontrollera om en tabell finns i SQL Server för exempel.
Alternativ 2:Fråga sys.tables
Ett annat sätt att kontrollera om en tabell redan finns är att fråga sys.tables
systemkatalogvy.
Exempel:
IF NOT EXISTS (
SELECT * FROM sys.tables t
JOIN sys.schemas s ON (t.schema_id = s.schema_id)
WHERE s.name = 'dbo' AND t.name = 't1')
CREATE TABLE dbo.t1 (
c1 int,
c2 varchar(10)
);
Det gör något liknande det föregående exemplet; den kontrollerar om tabellen finns och skapar den bara om den inte finns.
Oavsett vilken metod som används för att kontrollera om tabellen existerar, slutförs kommandot framgångsrikt, oavsett om tabellen finns eller inte.
Så vi får följande utdata från båda metoderna:
Commands completed successfully.
Jag får det meddelandet oavsett om tabellen redan fanns eller inte.
Om tabellen redan finns, men vi inte kontrollerar om tabellen finns, får vi ett felmeddelande som detta:
Msg 2714, Level 16, State 6, Line 1 There is already an object named 't1' in the database.
Det är viktigt att notera att bara för att en tabell med det namnet redan finns i databasen betyder det inte att den har rätt definition. Ovanstående metoder letar helt enkelt efter tabellen med namn och schema.