Sprawdź, czy tabela istnieje w SQL Server

1142

Chciałbym, aby była to ostateczna dyskusja na temat sprawdzania, czy tabela istnieje w SQL Server 2000/2005 przy użyciu instrukcji SQL.

Gdy szukasz odpowiedzi na Google, dostajesz tak wiele różnych odpowiedzi. Czy istnieje oficjalny / zgodny z poprzednimi wersjami sposób?

Oto dwa możliwe sposoby zrobienia tego. Który z nich jest standardowym / najlepszym sposobem na zrobienie tego?

Pierwszy sposób:

IF EXISTS (SELECT 1 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

Drugi sposób:

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL zapewnia proste

SHOW TABLES LIKE '%tablename%'; 

komunikat. Szukam czegoś podobnego.

Vincent
źródło
1
Dlaczego najlepiej jest używać INFORMACJE_SCHEMA.TABLES zamiast sys.tables, a następnie odfiltrować według nazwy, może dodać kontrolę wartości type_desc?
DanteTheSmith

Odpowiedzi:

1331

W przypadku takich zapytań zawsze najlepiej jest użyć INFORMATION_SCHEMAwidoku. Widoki te są (głównie) standardowe w wielu różnych bazach danych i rzadko zmieniają się z wersji na wersję.

Aby sprawdzić, czy tabela istnieje, użyj:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END
akmad
źródło
12
Działa świetnie! Jednak w T-SQL (w odpowiedzi na oryginalny plakat) jest to TABLE_SCHEMA, a nie SCHEMA_NAME. Dzięki za wskazówkę.
Nicholas Piasecki
10
Biorąc pod uwagę, że sama nazwa obiektu (tzn. Bez schematu) nie jest gwarantowana jako unikalna, nie ma w 100% bezpiecznego sposobu na wykonanie tego. Jeśli pracujesz z bazą danych, która nie ma konfliktów nazw między schematami, wystarczy po prostu pominąć „TABLE_SCHEMA = 'TheSchema'”.
akmad
26
Aby sprawdzić tabelę tymczasową, musimy wykonać zapytanie do bazy danych tempdb i użyć operatora LIKE dla nazwy tabeliSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pierre-Alain Vigeant
4
Poniższa odpowiedź, która korzysta z funkcji OBJECT_ID, działa poprawnie w odniesieniu do tabel temp dla poszczególnych połączeń - stackoverflow.com/a/2155299/16147
Rich Rousseau
4
@akmad Kompilator zapytań SQL sprawdzi tabelę przed uruchomieniem zapytania i zakończy się niepowodzeniem nawet przed uruchomieniem.
Marc K
278

Pamiętaj również, że jeśli z jakiegoś powodu musisz sprawdzić tabelę tymczasową, możesz to zrobić:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists
James Bloomer
źródło
10
Korzystanie z tej metody wydaje się respektować charakter tabel tymczasowych dla poszczególnych połączeń. Wcześniej wysłane zapytanie INFORMACJE_SCHEMA zwróci wiersze niezależnie od połączenia, które utworzyło tabelę.
Rich Rousseau,
238

Zawsze używamy tego OBJECT_IDstylu tak długo, jak pamiętam

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 
Bob King
źródło
16
Wierzę, że byłoby to szybkie, choć niezbyt przenośne. Widoki schematów informacyjnych na pewno istnieją w każdym systemie DBRMS, który obsługuje standard. Ponadto zwykły OBJECT_ID nie gwarantuje, że obiekt jest tabelą.
Joe Pineda
9
Dzięki Joe, zastanawiałem się, dlaczego miałbyś używać OBJECT_ID vs INFORMACJE_SCHEMA.TABLES vs sys.tables. Wskazując, że INFORMACJE_SCHEMA jest częścią standardowej odpowiedzi na to pytanie. BTW to zabawne, jeden z naszych ekspertów od baz danych, który chciałem zadać to pytanie, ma takie samo nazwisko jak ty, musi być dobrym nazwiskiem dla baz danych.
Apeiron,
24
@JoePineda: Następnie wykorzystaj przypadek, OBJECT_ID('TableName', 'U')aby zagwarantować, że obiekt jest tabelą.
Allon Guralnek
1
@AllonGuralnek, więc zamiast postępować zgodnie z prostym i przenośnym standardem, dodaj dodatkowy kawałek tajemniczych informacji?
określa
22
@DustinFineout: Pytanie zostało oznaczone tagiem tsql , więc przenośność nie dotyczy tak dużo. Zasadniczo napotkałem bardzo niewiele naprawdę przenośnych podstaw kodowych i jeśli zwięzłość jest doceniana, to na pewno bije to pisanie tego IF EXISTSzapytania z zaakceptowanej odpowiedzi w kółko. Ponadto wszystko jest tajemnicze, dopóki nie przeczytasz dokumentacji, szczególnie w języku T-SQL (lub jakimkolwiek innym wariancie).
Allon Guralnek
132

Zobacz poniższe podejścia,

Podejście 1: Korzystanie z widoku INFORMACJE_SCHEMA.TABLES

Możemy napisać zapytanie jak poniżej, aby sprawdzić, czy istnieje tabela klientów w bieżącej bazie danych.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

Podejście 2: Korzystanie z funkcji OBJECT_ID ()

Możemy użyć funkcji OBJECT_ID () jak poniżej, aby sprawdzić, czy istnieje tabela klientów w bieżącej bazie danych.

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

Podejście 3: Korzystanie z widoku katalogu sys.Objects

Możemy użyć widoku katalogu Sys.Objects, aby sprawdzić istnienie tabeli, jak pokazano poniżej:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

Podejście 4: Korzystanie z widoku katalogu sys.Tables

Możemy użyć widoku katalogu Sys.Tables, aby sprawdzić istnienie tabeli, jak pokazano poniżej:

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

Podejście 5: Unikaj używania tabeli systemowej sys.sysobjects

Powinniśmy unikać bezpośredniego używania tabeli systemowej sys.sysobjects, bezpośredni dostęp do niej będzie przestarzały w niektórych przyszłych wersjach Sql Server. Zgodnie z linkiem Microsoft BOL, Microsoft sugeruje użycie widoków katalogu sys.objects / sys.tables zamiast bezpośrednio tabeli systemowej sys.sysobjects.

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

odesłany z: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/

BrainCoder
źródło
37

Szukasz tabeli w innej bazie danych:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
Larry Leonard
źródło
26

Chciałem tylko wspomnieć o jednej sytuacji, w której prawdopodobnie łatwiej byłoby użyć tej OBJECT_IDmetody. Te INFORMATION_SCHEMAwidoki są obiektami pod każdym od bazy danych

Widoki schematu informacyjnego są zdefiniowane w specjalnym schemacie o nazwie INFORMACJE_SCHEMA. Ten schemat jest zawarty w każdej bazie danych.

https://msdn.microsoft.com/en-us/library/ms186778.aspx

Dlatego wszystkie tabele, do których uzyskujesz dostęp

IF EXISTS (SELECT 1 
           FROM [database].INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

odzwierciedla tylko to, co jest w środku [database]. Jeśli chcesz sprawdzić, czy tabele w innej bazie danych istnieją, bez dynamicznej zmiany za [database]każdym razem, OBJECT_IDpozwoli ci to zrobić od razu po wyjęciu z pudełka. Dawny-

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

działa równie dobrze jak

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL SERVER 2016 Edycja :

Począwszy od 2016 r. Microsoft uprościł możliwość sprawdzania nieistniejących obiektów przed usunięciem, dodając if existssłowa kluczowe do dropinstrukcji. Na przykład,

drop table if exists mytablename

zrobi to samo co OBJECT_ID/ INFORMATION_SCHEMAwrappers, w 1 linii kodu.

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

iliketocode
źródło
24
IF OBJECT_ID('mytablename') IS NOT NULL 
sansalk
źródło
13

Używanie schematu informacyjnego jest standardowym sposobem SQL, więc należy go używać we wszystkich bazach danych, które go obsługują.

Vinko Vrsalovic
źródło
12
To powinien być komentarz.
underscore_d
3
Ta odpowiedź wymaga poprawy.
rory.ap
11
IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

W powyższym kodzie nazwa tabeli to Mapping_APCToFANavigator.

dilip Kumar Singh
źródło
2
Jeśli kod pocztowy, próbki XML lub danych, należy zaznaczyć te linie w edytorze tekstowym i kliknij na przycisk „Kod próbki” ( { }) na pasku narzędzi edytora, aby ładnie format i składnia go podświetlić!
marc_s
1
Należy pamiętać, że dostęp do tabel systemowych może zostać przerwany w przyszłej wersji programu SQL Server. Zamiast tego użyj widoków schematu.
Olivier Jacot-Descombes
10

Jeśli musisz pracować na różnych bazach danych:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END
Nawet Mien
źródło
1
Jesteś pewny? Schemat informacyjny na moim pudełku z 2005 r. Zwraca tylko bieżący katalog.
quillbreaker,
8

Wiem, że to stare pytanie, ale znalazłem taką możliwość, jeśli planujesz często dzwonić.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
dko
źródło
9
-1. Nie ma sensu mieć do tego procedury, ponieważ wystarczy tyle kodu, aby wywołać i zużyć zwrot, jak po prostu dokonać wyboru. Nie należy używać sysnametypu danych varchar(50). Nie należy używać przestarzałego sysobjectswidoku i nie uwzględnia schematu.
Martin Smith
6

Możesz użyć poniższego kodu

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

Lub

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END
Reza Jenabi
źródło
5

Właśnie dodam tutaj, z korzyścią dla programistów i innych DBA

skrypt, który odbiera @Tablename jako parametr

(który może zawierać lub nie zawierać nazwy schematu) i zwraca poniższe informacje, jeśli istnieje tabela schematu:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

Stworzyłem ten skrypt do użycia w innych skryptach za każdym razem, gdy muszę przetestować, czy istnieje tabela lub widok, a kiedy już istnieje, pobierz jej identyfikator_obiektu do innych celów.

Zgłasza błąd, gdy przekazujesz pusty ciąg, niepoprawną nazwę schematu lub niewłaściwą nazwę tabeli.

może to być na przykład procedura i zwracać -1.

Jako przykład mam tabelę „Facts.FactBackOrder” w jednej z moich baz danych hurtowni danych.

Oto jak to osiągnąłem:

PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME() 
PRINT ''
GO

SET NOCOUNT ON
GO

--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================

DECLARE @TableName SYSNAME

SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT 

SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)

IF (@Z = 0) BEGIN

            RAISERROR('Invalid @Tablename passed.',16,1)

END 

SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I

IF @I > 0 BEGIN

        --===================================================================================
        -- a schema and table name have been passed
        -- example Facts.FactBackOrder 
        -- @Schema = Fact
        -- @TableName = FactBackOrder
        --===================================================================================

   SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)
   SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@Z-@I)



END
ELSE BEGIN

        --===================================================================================
        -- just a table name have been passed
        -- so the schema will be dbo
        -- example Orders
        -- @Schema = dbo
        -- @TableName = Orders
        --===================================================================================

   SELECT @Schema    = 'DBO'     


END

        --===================================================================================
        -- Check whether the @SchemaName is valid in the current database
        --===================================================================================

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN

            RAISERROR('Invalid Schema Name.',16,1)

END 

--SELECT @Schema  as [@Schema]
--      ,@TableName as [@TableName]


DECLARE @R1 TABLE (

   THE_NAME SYSNAME
  ,THE_SCHEMA SYSNAME
  ,THE_TABLE SYSNAME
  ,OBJECT_ID INT
  ,THE_TYPE SYSNAME
  ,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)

)

;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
      ,the_schema=SCHEMA_NAME(O.schema_id)
      ,the_table=O.NAME
      ,object_id =o.object_id 
      ,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END 
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
   THE_NAME 
  ,THE_SCHEMA 
  ,THE_TABLE 
  ,OBJECT_ID
  ,THE_TYPE 
)
SELECT  the_name
       ,the_schema
       ,the_table
       ,object_id
       ,the_type
FROM RADHE_01
WHERE the_schema = @Schema 
  AND the_table  = @TableName

IF (@@ROWCOUNT = 0) BEGIN 

             RAISERROR('Invalid Table Name.',16,1)

END 
ELSE BEGIN

    SELECT     THE_NAME 
              ,THE_SCHEMA 
              ,THE_TABLE 
              ,OBJECT_ID
              ,THE_TYPE 

    FROM @R1

END 
Marcello Miorelli
źródło
W twoim skrypcie jest wiele założeń. Na przykład mógłbym łatwo utworzyć tabelę o nazwie, dbo.[hello.world ]a skrypt nie znalazłby jej z wielu powodów. To powiedziawszy, jest mało prawdopodobne, aby ktoś chciał stworzyć taki stół, ale nadal. W każdym razie twoja THE_NAMEkolumna jest zdefiniowana jako sysname', yet you try to squeeze 2 kolumny sysname` i kropka ( .), wszystkie otoczone nawiasami kwadratowymi ... że pewnego dnia jedna z nich zawiedzie!
deroby
@deroby Zgadzam się, że sysname nie jest najlepszym typem danych do użycia, ale skrypt działa od dłuższego czasu bez żadnych błędów, spędziłbym na nim czas tylko wtedy, gdy znajdę rozsądną sytuację, w której nie zadziała. Co więcej, weź ten kod, popraw go i opublikuj tutaj jako odpowiedź, a ja go przetestuję, jeśli zadziała, poprę twoją odpowiedź.
Marcello Miorelli,
5

W SQL Server 2000 możesz spróbować:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
dipi zło
źródło
3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
Mokasyn
źródło
2

Coś ważnego dla każdego, kto jeszcze nie znalazł rozwiązania: SQL Server! = MYSQL . Jeśli chcesz to zrobić za pomocą MySQL , jest to dość proste

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
    $result = mysql_query($sql);
    if( $result == false )
        echo "table DOES NOT EXIST";
    else
        echo "table exists";

Publikowanie tego tutaj, ponieważ jest to największy hit w Google.

phil294
źródło
4
-1, ponieważ OP dokładnie prosi o rozwiązanie problemu SQL Server, a nie MySQL. Napisał o MySQL, ponieważ znał rozwiązanie na tym DBMS i chciał tego samego wyniku na SQL Server. Twoja odpowiedź nie jest nawet zapytaniem MySQL, ale kodem PHP współpracującym z MySQL.
mordack550,
1
@ mordack550, zgadzam się z Blauhirnem. On ma rację. Jest to największy hit w Google, jeśli chodzi o sprawdzenie, czy tabela istnieje w SQL. Jego zamiary są dobre, a jego informacje są pomocne. +1
Mark
To niefortunne, że Microsoft ma zwyczaj próbować stosować / rozszerzać / gasić wspólne standardy i wzorce, takie jak SQL. Naprawdę chciałbym, aby nadali swojej implementacji serwera SQL prawidłową nazwę, aby ludzie mogli jednoznacznie zidentyfikować referencje dotyczące ich produktu.
psaxton
2
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO
Krishnaraj Barvathaya
źródło
2

Możesz użyć tego:

     IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL 
        BEGIN 
            print 'deleted table';
            drop table t 
        END
     else 
        begin 
            print 'table not found' 
        end

 Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
 insert into t( name, lastname) values('john','doe');
 insert into t( name, lastname) values('rose',NULL);

 Select * from t
1   john    doe
2   rose    NULL

 -- clean
 drop table t
BTE
źródło
1
select name from SysObjects where xType='U' and name like '%xxx%' order by name
MarceloMadnezz
źródło
1

- - utwórz procedurę sprawdzania, czy tabela istnieje


DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

- - jak używać: sprawdź, czy istnieją migracje tabel


 CALL checkIfTableExists('muDbName', 'migrations', @output);
Mathieu Dierckx
źródło
1
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and 
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted

BEGIN
--TABLE EXISTS
END

ELSE BEGIN
--TABLE DOES NOT EXISTS
END
Mohamad Reza Shahrestani
źródło
1

biorę tutaj, tworząc widok jako przykład .

Ponieważ polecenia ALTER / CREATE nie mogą znajdować się w blokach BEGIN / END. Musisz przetestować istnienie i upuścić je przed utworzeniem

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

Jeśli obawiasz się utraty uprawnień, możesz również napisać skrypt instrukcji GRANT i ponownie uruchomić je na końcu.

Możesz owinąć create / alter w ciąg i wykonać EXEC - co może być brzydkie w przypadku dużych widoków

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL
Kelum Sampath Edirisinghe
źródło
0

Jeśli ktoś próbuje zrobić to samo w Linq na sql (a szczególnie Linqpad), włącz opcję dołączania tabel systemowych i widoków i wykonaj ten kod:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

biorąc pod uwagę, że masz obiekt o nazwie we właściwości o nazwie item oraz schemat we właściwości o nazwie schemat, w którym nazwa zmiennej źródłowej to a

Masłów
źródło
0

Jeśli ma to być „ostateczna” dyskusja, należy zauważyć, że skrypt Larry'ego Leonarda może również wysyłać zapytania do zdalnego serwera, jeśli serwery są połączone.

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
użytkownik3651072
źródło
Może lepiej jest dodać to jako komentarz do odpowiedzi Leonarda, a może jako edycję?
EWit,
0

Miałem pewne problemy z wybraniem spośród INFORMAL_SCHEME i OBJECT_ID. Nie wiem, czy jest to problem ze sterownikiem ODBC czy coś takiego. Zapytania ze studia zarządzania SQL, oba były w porządku.

Oto rozwiązanie:

SELECT COUNT(*) FROM <yourTableNameHere>

Jeśli więc zapytanie nie powiedzie się, prawdopodobnie nie ma takiej tabeli w bazie danych (lub nie masz do niej uprawnień dostępu).

Sprawdzanie odbywa się poprzez porównanie wartości (w moim przypadku liczby całkowitej) zwróconej przez executor SQL, który zajmuje się sterownikiem ODBC.

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
Michael Quad
źródło
Nie powiedzie się z jakim wyjściem?
wscourge
@wscourge, zapytanie SQL nie powiodło się lub coś podobnego. Właśnie sprawdzam wartość zwracaną z funkcji executora.
Michael Quad
Dodaj go do swojej odpowiedzi
wscourge
0

Jest jeszcze jedna opcja, aby sprawdzić, czy tabela istnieje między bazami danych

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END
Jitan Gupta
źródło
-1

Uruchom to zapytanie, aby sprawdzić, czy tabela istnieje w bazie danych:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
S Kryszna
źródło
-6

weź pod uwagę, że w jednej bazie danych masz tabelę t1. chcesz uruchomić skrypt na innej bazie danych, na przykład - jeśli t1 istnieje, nie rób nic więcej, twórz t1. Aby zrobić to otwarte studio wizualne i wykonaj następujące czynności:

Kliknij prawym przyciskiem myszy t1, następnie Skrypt tabeli jako, następnie DROP i Utwórz do, a następnie Nowy edytor zapytań

znajdziesz żądane zapytanie. Ale przed uruchomieniem tego skryptu nie zapomnij skomentować instrukcji drop w zapytaniu, ponieważ nie chcesz tworzyć nowego, jeśli już istnieje.

Dzięki

sumon
źródło
W SSMS 2012 nie wykonuje już sprawdzenia, czy kiedykolwiek istniał, jeśli kiedykolwiek to zrobił (nie pamiętam, jak poprzednie wersje wygenerowały powyższy skrypt). Może mylisz się ze sposobem, w jaki inne narzędzia db są skryptowymi obiektami tabeli?
Ivaylo Slavov
SSMS sprawdzi, czy istnieje, jeśli o to poprosisz. Narzędzia> Opcje> Eksplorator obiektów SQL Server> Skrypty> „Opcje skryptów obiektowych”: „Sprawdź istnienie obiektu” = True
Seann Alexander