Sto scrivendo una procedura memorizzata in SQL Server 2008. Devo verificare se esiste una tabella nel database. In caso contrario, devo crearlo.
Come faccio a fare questo?
CREATE TABLE IF NOT EXISTS ...
Sto scrivendo una procedura memorizzata in SQL Server 2008. Devo verificare se esiste una tabella nel database. In caso contrario, devo crearlo.
Come faccio a fare questo?
CREATE TABLE IF NOT EXISTS ...
Risposte:
Qualcosa come questo
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[YourTable](
....
....
....
)
END
if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
Solo per contrasto, mi piace usare la funzione object_id come mostrato di seguito. È un po 'più facile da leggere e non devi preoccuparti di sys.objects vs. sysobjects vs. sys.all_objects vs. sys.tables. Forma base:
IF object_id('MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Naturalmente questo mostrerà come "Presente" se c'è qualche oggetto presente con quel nome. Se vuoi controllare solo le tabelle, avresti bisogno di:
IF object_id('MyTable', 'U') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Funziona anche con tabelle temporanee:
IF object_id('tempdb.dbo.#MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Creiamo un database di esempio con una tabella con lo script seguente:
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
Approccio 1: utilizzo della vista INFORMATION_SCHEMA.TABLES
Possiamo scrivere una query come sotto per verificare se esiste una tabella tblTest nel database corrente.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
La query sopra verifica l'esistenza della tabella tblTest in tutti gli schemi nel database corrente. Invece di questo se si desidera verificare l'esistenza della tabella in uno schema specificato e nel database specificato, è possibile scrivere la query sopra come di seguito:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
Pro di questo approccio: le viste INFORMATION_SCHEMA sono portatili su diversi sistemi RDBMS, quindi il porting su diversi RDBMS non richiede alcuna modifica.
Approccio 2: utilizzo della funzione OBJECT_ID ()
Possiamo usare la OBJECT_ID()
funzione come sotto per verificare se esiste una tabella tblTest nel database corrente.
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
La specifica delle parti Nome database e Nome schema per il Nome tabella è facoltativa. Ma la specifica del Nome database e del Nome schema fornisce un'opzione per verificare l'esistenza della tabella nel database specificato e all'interno di uno schema specificato, anziché effettuare il check-in nel database corrente in tutti gli schemi. La query seguente mostra che anche se il database corrente è il database MASTER, possiamo verificare l'esistenza della tblTest
tabella nello dbo
schema nel Test
database.
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Pro: facile da ricordare. Un altro punto degno di nota sulla OBJECT_ID()
funzione è: fornisce un'opzione per verificare l'esistenza della tabella temporanea creata nel contesto di connessione corrente. Tutti gli altri approcci verifica l'esistenza della tabella temporanea creata in tutti i contesti di connessione anziché solo nel contesto di connessione corrente. La query di seguito mostra come verificare l'esistenza di una tabella temporanea utilizzando la OBJECT_ID()
funzione:
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
Approccio 3: utilizzo di sys.Objects Catalog View
Possiamo usare la Sys.Objects
vista del catalogo per verificare l'esistenza della tabella come mostrato di seguito:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Approccio 4: utilizzo di sys.Tables Visualizzazione catalogo
Possiamo usare la Sys.Tables
vista del catalogo per verificare l'esistenza della tabella come mostrato di seguito:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables
la vista del catalogo eredita le righe dalla Sys.Objects
vista del catalogo, la vista del Sys.objects
catalogo viene definita vista di base dove sys.Tables
viene definita vista derivata. Sys.Tables
restituirà le righe solo per gli oggetti Table mentre Sys.Object
view oltre a restituire le righe per gli oggetti table, restituisce righe per gli oggetti come: stored procedure, viste ecc.
Approccio 5: evitare l'uso della tabella di sistema sys.sysobjects
Dovremmo evitare di usare sys.sysobjects
direttamente la tabella di sistema, l'accesso diretto ad esso sarà deprecato in alcune versioni future del server SQL. Secondo il link [Microsoft BOL] [1], Microsoft suggerisce di utilizzare direttamente le viste del catalogo sys.objects/sys.tables
anziché la sys.sysobjects
tabella di sistema.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
Riferimento: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'd020915'))
BEGIN
declare @result int
set @result=1
select @result as result
END
Declare @Username varchar(20)
Set @Username = 'Mike'
if not exists
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')
Begin
Create table tblEmp (ID int primary key, Name varchar(50))
Print (@Username + ' Table created successfully')
End
Else
Begin
Print (@Username + ' : this Table Already exists in the database')
End
Prova la seguente dichiarazione per verificare l'esistenza di una tabella nel database:
If not exists (select name from sysobjects where name = 'tablename')
È possibile creare la tabella all'interno del blocco if.
sysobjects
è una vista di compatibilità che esiste solo per evitare di rompere il codice più vecchio. Il mio suggerimento sarebbe di utilizzare le viste del catalogo di sistema (ad es sys.objects
. sys.tables
) Per il codice destinato esclusivamente alle istanze di SQL Server 2008 e le viste dello schema di informazioni (ad es. information_schema.tables
) Per il codice che deve essere portatile. Puoi trovare ulteriori informazioni sulle diverse visualizzazioni qui: Richiesta del catalogo di sistema di SQL Server
Se non sbaglio, dovrebbe funzionare:
if not exists (Select 1 from tableName)
create table ...