sql-server - 確認 - sqlserver 一時テーブル存在チェック




SQL Serverにテーブルが存在するかどうかを確認する (15)

SQLステートメントを使用してSQL Server 2000/2005にテーブルが存在するかどうかをチェックする方法に関する究極のディスカッションです。

答えがGoogleの場合、非常に多くの答えが得られます。 それを行う公式/後方と前方互換の方法がありますか?

これを行うには2つの方法があります。 どの2つの中のどれがそれを行う標準/最良の方法ですか?

最初の方法:

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;

二番目の方法:

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

MySQLはシンプルです

SHOW TABLES LIKE '%tablename%'; 

ステートメント。 私は似たようなものを探しています。


    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

- - テーブルが存在するかどうかを確認するプロシージャを作成する

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 ;

- 使用方法:テーブルの移行が存在するかどうかを確認する

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

OBJECT_IDメソッドを使用するほうが少し簡単かもしれない1つの状況について言及したかっただけです。 INFORMATION_SCHEMAビューは、各データベースの下にあるオブジェクトです。

情報スキーマ・ビューは、INFORMATION_SCHEMAという特殊なスキーマに定義されています。 このスキーマは各データベースに含まれています。

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

したがって、あなたがアクセスするすべてのテーブルは、

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;

[database]ものだけが反映され[database] 。 毎回[database]を動的に変更することなく、 別のデータベースのテーブルが存在するかどうかを確認する場合は、 OBJECT_IDを使用してこれを行うことができます。 Ex-

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

ちょうど同様に働く

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

SQL Server 2016編集

2016年以降、Microsoftは、 drop文にif existsキーワードを追加することにより、削除前に存在しないオブジェクトをチェックする機能を単純化しました。 例えば、

drop table if exists mytablename

1行のコードでOBJECT_ID / INFORMATION_SCHEMAラッパーと同じことを行います。

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


SQL Server 2000では、次のことを試すことができます。

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

これが「究極の」議論であれば、Larry Leonardのスクリプトはサーバーがリンクされている場合でもリモートサーバーにも照会できることに注意してください。

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

また、何らかの理由で一時テーブルをチェックする必要がある場合は、これを行うことができます:

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

以下のアプローチをご覧ください。

アプローチ1:INFORMATION_SCHEMA.TABLESビューの使用

Customersテーブルが現在のデータベースに存在するかどうかを確認するために、以下のようなクエリを書くことができます。

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

アプローチ2:OBJECT_ID()関数の使用

Customersテーブルが現在のデータベースに存在するかどうかを確認するために、以下のようなOBJECT_ID()関数を使用することができます。

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

アプローチ3:sys.Objectsカタログビューの使用

Sys.Objectsカタログビューを使用して、次のように表の有無を確認できます。

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

アプローチ4:sys.Tablesカタログビューの使用

Sys.Tablesカタログビューを使用して、次のように表の有無を確認できます。

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

アプローチ5:sys.sysobjectsシステムテーブルの使用を避ける

sys.sysobjects System Tableを直接使用することは避けてください.Sql Serverの将来のバージョンでは、直接アクセスできなくなります。 Microsoft BOLのリンクに従って、Microsoftはsys.sysobjectsシステムテーブルの代わりにsys.objects / sys.tablesカタログビューを直接使用することを提案しています。

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

から参照: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/ : http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/


別のデータベースでテーブルを探している:

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

異なるデータベースで作業する必要がある場合:

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

私はそれが古い質問であることを知っていますが、あなたはそれを頻繁に呼び出す予定がある場合、私はこの可能性を見つけました。

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

誰かがlinqからSQL(または特にlinqpad)に同じことをしようとしている場合は、システムテーブルとビューをインクルードしてこのコードを実行するオプションをオンにします:

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

itemという名前のプロパティに名前を持つオブジェクトがあり、schemaというプロパティのスキーマはソース変数nameがa


開発者と同僚のDBAのためにここに追加するだけです

@Tablenameをパラメータとして受け取るスクリプト

(スキーマ名を含む場合と含まない場合があります)、schema.tableが存在する場合は以下の情報を返します。

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

私はこのスクリプトを作成して、テーブルやビューが存在するかどうかをテストする必要があるたびに他のスクリプト内で使用し、そうであればobject_idを他の目的に使用するようにしました。

空の文字列、間違ったスキーマ名、または間違ったテーブル名を渡すと、エラーが発生します。

これはプロシージャ内にあり、たとえば-1を返します。

たとえば、データウェアハウスデータベースの1つに「Facts.FactBackOrder」というテーブルがあります。

これが私がこれを達成した方法です:

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,@[email protected])



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 

IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

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

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

select name from SysObjects where xType='U' and name like '%xxx%' order by name






sql-server-2000