Check if table exists in SQL Server

前端 未结 28 1513
梦如初夏
梦如初夏 2020-11-22 04:23

I would like this to be the ultimate discussion on how to check if a table exists in SQL Server 2000/2005 using SQL Statements.

When you Google for the answer, you g

28条回答
  •  一向
    一向 (楼主)
    2020-11-22 05:05

    Just adding here, for the benefit of developers and fellow DBAs

    a script that receives @Tablename as a parameter

    (which may or may not contain the schemaname) and returns the info below if the schema.table exists:

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

    I produced this script to be used inside other scripts every time I need to test whether or not a table or view exists, and when it does, get its object_id to be used for other purposes.

    It raises an error when either you passed an empty string, wrong schema name or wrong table name.

    this could be inside a procedure and return -1 for example.

    As an example, I have a table called "Facts.FactBackOrder" in one of my Data Warehouse databases.

    This is how I achieved this:

    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 
    

提交回复
热议问题