Kiểm tra xem bảng có tồn tại trong SQL Server không


1143

Tôi muốn đây là cuộc thảo luận cuối cùng về cách kiểm tra xem một bảng có tồn tại trong SQL Server 2000/2005 bằng cách sử dụng Báo cáo SQL hay không.

Khi bạn Google cho câu trả lời, bạn nhận được rất nhiều câu trả lời khác nhau. Có một cách tương thích chính thức / lạc hậu và chuyển tiếp để làm điều đó?

Đây là hai cách có thể làm điều đó. Mà một trong hai là cách tiêu chuẩn / tốt nhất để làm điều đó?

Cách thứ nhất:

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;

Cách thứ hai:

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

MySQL cung cấp đơn giản

SHOW TABLES LIKE '%tablename%'; 

tuyên bố. Tôi đang tìm kiếm một cái gì đó tương tự.


1
Tại sao tốt nhất là sử dụng Information_SCHema.TABLES thay vì sys.tables sau đó lọc ra với tên bất kỳ có thể thêm kiểm tra giá trị type_desc?
DanteTheSmith

Câu trả lời:


1332

Đối với các truy vấn như thế này, tốt nhất là sử dụng INFORMATION_SCHEMAchế độ xem. Các chế độ xem này (hầu hết) là tiêu chuẩn trên nhiều cơ sở dữ liệu khác nhau và hiếm khi thay đổi từ phiên bản này sang phiên bản khác.

Để kiểm tra nếu một bảng tồn tại, sử dụng:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

12
Hoạt động tuyệt vời! Tuy nhiên, trong T-SQL (để phản hồi lại poster gốc), đó là TABLE_SCHema, không phải SCHema_NAME. Cảm ơn vì tiền hỗ trợ.
Nicholas Piasecki

10
Cho rằng một tên đối tượng (nghĩa là không có lược đồ) không được đảm bảo là duy nhất, không có cách nào an toàn 100% để làm điều này. Nếu bạn đang làm việc với một DB không có xung đột đặt tên trên các lược đồ thì chỉ cần bỏ qua "TABLE_SCHema = 'TheSchema'" sẽ hoạt động tốt.
akmad

26
Để kiểm tra bảng tạm thời, chúng tôi phải truy vấn cơ sở dữ liệu tempdb và sử dụng toán tử THÍCH cho tên bảngSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pierre-Alain Vigeant

4
Một phản hồi bên dưới sử dụng hàm OBJECT_ID hoạt động chính xác liên quan đến mỗi bảng tạm thời kết nối - stackoverflow.com/a/2155299/16147
Rich Rousseau

4
@akmad Trình biên dịch truy vấn SQL sẽ kiểm tra bảng trước khi chạy truy vấn và sẽ thất bại trước khi bắt đầu.
Marc K

278

Cũng lưu ý rằng nếu vì bất kỳ lý do gì bạn cần kiểm tra bảng tạm thời, bạn có thể thực hiện việc này:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

10
Sử dụng phương pháp này dường như tôn trọng tính chất kết nối của các bảng tạm thời. Truy vấn Information_SCHema được đăng trước đó sẽ trả về các hàng bất kể kết nối đã tạo bảng.
Rich Rousseau

238

Chúng tôi luôn sử dụng OBJECT_IDphong cách miễn là tôi nhớ

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 

16
Tôi tin rằng điều này sẽ nhanh, mặc dù không phải là rất di động. Các khung nhìn lược đồ thông tin được đảm bảo tồn tại trên bất kỳ DBRMS nào hỗ trợ tiêu chuẩn. Hơn nữa, OBject_ID đơn giản không đảm bảo đối tượng là một bảng.
Joe Pineda

9
Cảm ơn Joe, tôi đã tự hỏi tại sao bạn sẽ sử dụng OBJECT_ID so với Information_SCHema.TABLES vs sys.tables. Chỉ ra rằng Information_SCHema là một phần của tiêu chuẩn khá nhiều câu trả lời cho câu hỏi đó. Thật buồn cười, một trong những chuyên gia Cơ sở dữ liệu của chúng tôi mà tôi sẽ hỏi câu hỏi này có cùng họ với bạn, phải là một tên cuối cùng tốt cho cơ sở dữ liệu.
Apeiron

24
@JoePineda: Sau đó, bạn sử dụng trường hợp OBJECT_ID('TableName', 'U')để đảm bảo đối tượng là một bảng.
Allon Guralnek

1
@ ALLonGuralnek vì vậy, thay vì tuân theo một tiêu chuẩn đơn giản và di động, hãy thêm một phần thông tin mật mã?
xác định

22
@DustinFineout: Câu hỏi đã được gắn thẻ tsql , vì vậy tính di động không áp dụng nhiều. Nói chung, tôi đã gặp rất ít các cơ sở mã di động thực sự và nếu tính ngắn gọn có giá trị thì nó chắc chắn sẽ đánh bại việc viết IF EXISTStruy vấn đó từ câu trả lời được chấp nhận nhiều lần. Thêm vào đó, mọi thứ đều khó hiểu cho đến khi bạn đọc tài liệu, đặc biệt là trong T-SQL (hoặc bất kỳ biến thể nào khác, thực sự).
Allon Guralnek

132

Xin vui lòng xem các cách tiếp cận dưới đây,

Cách tiếp cận 1: Sử dụng chế độ xem Information_SCHema.TABLES

Chúng tôi có thể viết một truy vấn như dưới đây để kiểm tra xem Bảng khách hàng có tồn tại trong cơ sở dữ liệu hiện tại không.

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

Cách tiếp cận 2: Sử dụng hàm OBJECT_ID ()

Chúng ta có thể sử dụng hàm OBJECT_ID () như bên dưới để kiểm tra xem Bảng khách hàng có tồn tại trong cơ sở dữ liệu hiện tại không.

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

Cách tiếp cận 3: Sử dụng sys.Objects Danh mục xem

Chúng ta có thể sử dụng khung nhìn danh mục Sys.Objects để kiểm tra sự tồn tại của Bảng như dưới đây:

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

Cách tiếp cận 4: Sử dụng sys.Tables Xem danh mục

Chúng ta có thể sử dụng khung nhìn danh mục Sys.Tables để kiểm tra sự tồn tại của Bảng như dưới đây:

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

Cách tiếp cận 5: Tránh sử dụng sys.sysobjects Bảng hệ thống

Chúng ta nên tránh sử dụng trực tiếp Bảng hệ thống sys.sysobjects, việc truy cập trực tiếp vào nó sẽ không được chấp nhận trong một số phiên bản tương lai của Máy chủ Sql. Theo liên kết Microsoft BOL, Microsoft đang đề xuất sử dụng danh mục lượt xem sys.objects / sys.tables thay vì bảng hệ thống sys.sysobjects.

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

được giới thiệu từ: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/


37

Tìm kiếm một bảng trên cơ sở dữ liệu khác nhau:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

26

Chỉ muốn đề cập đến một tình huống trong đó có lẽ sẽ dễ dàng hơn một chút để sử dụng OBJECT_IDphương pháp. Các INFORMATION_SCHEMAkhung nhìn là các đối tượng dưới mỗi cơ sở dữ liệu-

Các khung nhìn lược đồ thông tin được xác định trong một lược đồ đặc biệt có tên là Information_SCHema. Lược đồ này được chứa trong mỗi cơ sở dữ liệu.

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

Do đó, tất cả các bảng bạn truy cập bằng

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;

sẽ chỉ phản ánh những gì trong [database]. Nếu bạn muốn kiểm tra xem các bảng trong cơ sở dữ liệu khác có tồn tại hay không, mà không thay đổi động [database]mỗi lần, OBJECT_IDsẽ cho phép bạn thực hiện việc này ngoài hộp. Ví dụ-

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

hoạt động tốt như

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

SQL SERVER 2016 Chỉnh sửa :

Bắt đầu từ năm 2016, Microsoft đã đơn giản hóa khả năng kiểm tra các đối tượng không tồn tại trước khi loại bỏ, bằng cách thêm if existstừ khóa vào dropcâu lệnh. Ví dụ,

drop table if exists mytablename

sẽ làm điều tương tự như OBJECT_ID/ INFORMATION_SCHEMAhàm bao, trong 1 dòng mã.

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



13

Sử dụng Lược đồ thông tin là cách tiêu chuẩn SQL để thực hiện, vì vậy nó nên được sử dụng bởi tất cả các cơ sở dữ liệu hỗ trợ nó.


12
Điều này nên có một nhận xét.
gạch dưới

3
Câu trả lời này cần cải thiện.
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

Ở đây trong mã trên, tên bảng là Mapping_APCToFANavigator.


2
Nếu bạn đăng các mẫu mã, XML hoặc dữ liệu, vui lòng tô sáng các dòng đó trong trình soạn thảo văn bản và nhấp vào nút "mẫu mã" ( { }) trên thanh công cụ của trình soạn thảo để định dạng độc đáo và cú pháp tô sáng nó!
marc_s

1
Lưu ý rằng quyền truy cập vào các bảng hệ thống có thể bị ngừng trong phiên bản SQL Server trong tương lai. Sử dụng quan điểm Schema thay thế.
Olivier Jacot-Descombes

10

Nếu bạn cần làm việc trên các cơ sở dữ liệu khác nhau:

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

1
Bạn có chắc không? Lược đồ thông tin trên hộp năm 2005 của tôi chỉ trả về danh mục hiện tại.
quillbreaker

8

Tôi biết đó là một câu hỏi cũ nhưng tôi đã tìm thấy khả năng này nếu bạn định gọi nó thường xuyên.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

9
-1. Vô nghĩa có một thủ tục cho điều này vì nó là nhiều mã để gọi và tiêu thụ trả lại chỉ đơn giản là để thực hiện lựa chọn. Có nên dùng sysnamedatatype không varchar(50). Không nên sử dụng sysobjectschế độ xem không dùng nữa và không có tài khoản lược đồ.
Martin Smith

6

Bạn có thể sử dụng mã dưới đây

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

Hoặc là

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

5

Chỉ cần thêm vào đây, vì lợi ích của các nhà phát triển và các DBA đồng nghiệp

một tập lệnh nhận @Tablename làm tham số

(có thể có hoặc không chứa schemaname) và trả về thông tin bên dưới nếu lược đồ.table tồn tại:

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

Tôi đã tạo tập lệnh này để được sử dụng bên trong các tập lệnh khác mỗi lần tôi cần kiểm tra xem có tồn tại một bảng hoặc dạng xem hay không, và khi có, hãy sử dụng object_id của nó cho các mục đích khác.

Nó phát sinh lỗi khi bạn chuyển một chuỗi rỗng, tên lược đồ sai hoặc tên bảng sai.

điều này có thể nằm trong một thủ tục và trả về -1 chẳng hạn.

Ví dụ, tôi có một bảng có tên là "Fact.FactBackOrder" trong một trong các cơ sở dữ liệu Kho dữ liệu của tôi.

Đây là cách tôi đạt được điều này:

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 

Có rất nhiều giả định trong kịch bản của bạn. Chẳng hạn, tôi có thể dễ dàng bỏ qua một bảng có tên dbo.[hello.world ]và tập lệnh sẽ không tìm thấy nó vì nhiều lý do. Điều đó nói rằng, không ai có thể muốn tạo ra một bảng như vậy, nhưng vẫn còn. Dù sao, THE_NAMEcột của bạn được xác định là sysname', yet you try to squeeze 2 cột sysname` và dấu chấm ( .), tất cả được bao quanh trong dấu ngoặc vuông trong đó ... rằng cột đó chắc chắn sẽ thất bại vào một ngày nào đó!
deroby

@deroby Tôi đồng ý sysname không phải là loại dữ liệu tốt nhất được sử dụng, nhưng tập lệnh đã chạy trong một thời gian dài mà không có bất kỳ lỗi nào, tôi sẽ chỉ dành thời gian cho nó nếu tôi thấy tình huống hợp lý khi nó không hoạt động. Thậm chí tốt hơn, bạn lấy mã này, cải thiện nó và đăng nó ở đây như một câu trả lời và tôi sẽ kiểm tra nó, nếu nó hoạt động tôi sẽ nâng cao câu trả lời của bạn.
Marcello Miorelli

5

Trong SQL Server 2000, bạn có thể thử:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END

3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)

2

Một điều quan trọng cần biết đối với bất kỳ ai chưa tìm thấy giải pháp của họ: Máy chủ SQL! = MYSQL . Nếu bạn muốn làm điều đó với MYSQL , nó khá đơn giản

    $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";

Đăng bài này ở đây vì đó là bài viết hàng đầu tại Google.


4
-1 vì OP chính xác yêu cầu giải pháp SQL Server cho vấn đề chứ không phải giải pháp MySQL. Anh ấy đã viết về MySQL vì anh ấy biết giải pháp trên DBMS đó và anh ấy muốn kết quả tương tự trên SQL Server. Ngoài ra, câu trả lời của bạn thậm chí không phải là truy vấn MySQL, mà là mã PHP hoạt động với MySQL.
mordack550

1
@ mordack550, tôi đồng ý với Blauhirn. Anh ấy đúng. Đây là điểm nhấn hàng đầu trên Google để tìm hiểu xem bảng có tồn tại trong SQL không. Ý định của anh ấy là tốt và thông tin của anh ấy là hữu ích. +1
Đánh dấu

Thật không may là Microsoft có thói quen cố gắng Ôm / Mở rộng / Dập tắt các tiêu chuẩn và mẫu chung như SQL. Tôi thực sự mong muốn họ đã cho họ triển khai một máy chủ SQL để mọi người có thể xác định các tham chiếu cụ thể cho sản phẩm của họ một cách rõ ràng.
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

2

Bạn có thể sử dụng điều này:

     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


1

- - tạo thủ tục để kiểm tra nếu một bảng tồn tại


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 ;

- - cách sử dụng: kiểm tra xem di chuyển bảng có tồn tại không


 CALL checkIfTableExists('muDbName', 'migrations', @output);

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

1

tôi lấy ở đây để tạo ra một khung nhìn làm ví dụ .

Bởi vì các lệnh ALTER / CREATE không thể nằm trong các khối BEGIN / END. Bạn cần kiểm tra sự tồn tại và loại bỏ nó trước khi thực hiện tạo

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

GO

CREATE VIEW TestView
   as
   . . .

GO

Nếu bạn lo lắng về việc mất quyền, bạn cũng có thể viết kịch bản lệnh GRANT và chạy lại chúng ở cuối.

Bạn có thể gói tạo / thay đổi thành một chuỗi và thực hiện EXEC - điều đó có thể trở nên xấu xí đối với các chế độ xem lớn

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

0

Nếu bất cứ ai đang cố gắng làm điều tương tự trong linq to sql (hoặc đặc biệt là linqpad), hãy bật tùy chọn để bao gồm các bảng và khung nhìn hệ thống và thực hiện mã này:

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

cho rằng bạn có một đối tượng có tên trong một thuộc tính được gọi là item và lược đồ trong một thuộc tính được gọi là lược đồ trong đó tên biến nguồn là a


0

Nếu đây là cuộc thảo luận 'tối thượng', thì cần lưu ý rằng kịch bản của Larry Leonard cũng có thể truy vấn một máy chủ từ xa nếu các máy chủ được liên kết.

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

Có lẽ nó phù hợp hơn để thêm điều này như một nhận xét cho câu trả lời của Leonards hoặc có thể là một chỉnh sửa?
EWit

0

Tôi đã gặp một số vấn đề với việc chọn từ THÔNG TIN_SCHEME và OBJECT_ID. Tôi không biết liệu đó có phải là vấn đề của trình điều khiển ODBC hay gì không .. Các câu hỏi từ studio quản lý SQL, cả hai đều ổn.

Đây là giải pháp:

SELECT COUNT(*) FROM <yourTableNameHere>

Vì vậy, nếu truy vấn không thành công, có lẽ, không có bảng nào như vậy trong cơ sở dữ liệu (hoặc bạn không có quyền truy cập vào nó).

Việc kiểm tra được thực hiện bằng cách so sánh giá trị (số nguyên trong trường hợp của tôi) được trả về bởi trình thực thi SQL có liên quan đến trình điều khiển ODBC ..

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}

Thất bại với đầu ra gì?
wscourge 22/03/19

@wscourge, truy vấn SQL không thành công hoặc một cái gì đó tương tự. Tôi chỉ kiểm tra giá trị trả về từ hàm thực thi.
Michael Quad

Thêm nó vào câu trả lời của bạn
wscourge 22/03/19

0

Có thêm một tùy chọn để kiểm tra xem bảng có tồn tại trên cơ sở dữ liệu không

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END

-1

Chạy truy vấn này để kiểm tra nếu bảng tồn tại trong cơ sở dữ liệu:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';

-6

xem xét trong một cơ sở dữ liệu bạn có một bảng t1. bạn muốn chạy tập lệnh trên Cơ sở dữ liệu khác như - nếu t1 tồn tại thì không có gì khác tạo t1. Để làm điều này mở studio trực quan và làm như sau:

Nhấp chuột phải vào t1, sau đó vào bảng Script, sau đó DROP và Tạo thành, sau đó Trình soạn thảo truy vấn mới

bạn sẽ tìm thấy truy vấn mong muốn của bạn. Nhưng trước khi thực thi tập lệnh đó, đừng quên nhận xét câu lệnh thả trong truy vấn vì bạn không muốn tạo tập lệnh mới nếu đã có câu lệnh.

Cảm ơn


Trong SSMS 2012, nó không còn thực hiện kiểm tra nếu tồn tại, nếu nó đã từng làm điều đó (tôi không nhớ các phiên bản trước đã tạo tập lệnh trên như thế nào). Có thể bạn đang nhầm với cách các công cụ db khác đang tạo các đối tượng bảng kịch bản?
Ivaylo Slavov

SSMS sẽ thực hiện kiểm tra nếu tồn tại nếu bạn yêu cầu. Công cụ> Tùy chọn> SQL Server Object Explorer> Scripting> "Tùy chọn kịch bản đối tượng": "Kiểm tra sự tồn tại của đối tượng" = True
Seann Alexander
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.