سؤال

أود أن يكون هذا في نهاية المطاف النقاش حول كيفية التحقق إذا كان الجدول موجودا في SQL Server 2000/2005 باستخدام عبارات SQL.

عند جوجل عن الجواب ، يمكنك الحصول على الكثير من إجابات مختلفة.هل هناك مسؤول/الخلف وإلى الأمام متوافق طريقة لفعل ذلك ؟

هناك طريقتان يمكن من القيام بذلك.وهو واحد من بين اثنين هو المعيار/أفضل طريقة للقيام بذلك ؟

الطريقة الأولى:

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;

الخلية يوفر بسيطة

SHOW TABLES LIKE '%tablename%'; 

البيان.أنا أبحث عن شيء مشابه.

هل كانت مفيدة؟

المحلول

للاستفسارات مثل هذا فمن الأفضل دائما أن استخدام INFORMATION_SCHEMA عرض.هذه الآراء (في الغالب) القياسية في العديد من قواعد البيانات المختلفة و نادرا ما تتغير من نسخة إلى نسخة.

للتحقق مما إذا كان الجدول موجودا استخدام:

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

نصائح أخرى

لاحظ أيضا أنه إذا كان لأي سبب من الأسباب كنت تحتاج إلى التحقق من جدول مؤقت يمكنك القيام بذلك:

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

ونحن دائما استخدام OBJECT_ID أسلوب لطالما أتذكر

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

الرجاء راجع أدناه النهج ،

النهج 1:باستخدام INFORMATION_SCHEMA.عرض الجداول

يمكننا كتابة استعلام مثل أدناه لمعرفة ما إذا كان العملاء جدول موجود في قاعدة البيانات الحالية.

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

النهج 2:باستخدام OBJECT_ID() وظيفة

يمكننا استخدام OBJECT_ID() وظيفة ترغب أدناه لمعرفة ما إذا كان العملاء جدول موجود في قاعدة البيانات الحالية.

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

النهج 3:باستخدام sys.الكائنات عرض الكتالوج

يمكننا استخدام Sys.الكائنات كتالوج عرض للتحقق من وجود الجدول كما هو مبين أدناه:

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.طاولات عرض الكتالوج

يمكننا استخدام Sys.الجداول فهرس أجل التحقق من وجود الجدول كما هو مبين أدناه:

 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 نظام الجدول مباشرة, إمكانية الوصول المباشر إلى أنه سيتم إهمال في بعض الإصدارات المستقبلية من Sql Server.كما في مايكروسوفت بول الرابط, مايكروسوفت تقترح استخدام كتالوج آراء sys.الكائنات/sys.الجداول بدلا من sys.sysobjects نظام الجدول مباشرة.

  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/

أبحث عن جدول في قاعدة بيانات مختلفة:

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

أردت فقط أن أذكر حالة واحدة حيث سيكون أسهل قليلا إلى استخدام OBJECT_ID الأسلوب.على 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] في كل مرة ، OBJECT_ID سوف تتيح لك القيام بذلك في الخروج من مربع.السابق

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 مبسطة القدرة على التحقق من كائنات غير موجودة قبل أن يسقط ، عن طريق إضافة if exists الكلمات الرئيسية drop التصريحات.على سبيل المثال ،

drop table if exists mytablename

وسوف نفعل نفس الشيء OBJECT_ID / INFORMATION_SCHEMA مغلفة في 1 سطر من التعليمات البرمجية.

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

IF OBJECT_ID('mytablename') IS NOT NULL 

باستخدام المعلومات مخطط SQL القياسية طريقة للقيام بذلك ، لذلك ينبغي أن تستخدم من قبل جميع قواعد البيانات التي تدعم ذلك.

إذا كنت بحاجة إلى العمل على قواعد بيانات مختلفة:

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
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

هنا في التعليمات البرمجية أعلاه ، اسم الجدول Mapping_APCToFANavigator.

أنا أعرف أنها مسألة قديمة ولكن لقد وجدت هذا الاحتمال إذا كنت تخطط يطلق عليه في كثير من الأحيان.

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

فقط إضافة هنا ، لصالح المطورين الزميل دباس

السيناريو الذي يتلقى @Tablename كمعلمة

(والتي قد أو قد لا يحتوي على schemaname) وإرجاع المعلومات أدناه إذا كان المخطط.الجدول موجود:

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

أنا أنتجت هذا البرنامج النصي ليتم استخدامها داخل النصوص الأخرى في كل مرة كنت بحاجة إلى اختبار ما إذا كان أو لم يكن الجدول أو طريقة العرض موجود, وعندما تفعل ذلك, الحصول على object_id استخدامها لأغراض أخرى.

فإنه يثير خطأ عندما تقوم أنت تمرير سلسلة فارغة ، خطأ اسم المخطط أو خطأ اسم الجدول.

هذا يمكن أن يكون داخل الإجراء والعودة -1 على سبيل المثال.

كمثال لدي جدول يسمى "حقائق.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,@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 

في SQL Server 2000 يمكنك محاولة:

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

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
    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

شيء مهم أن نعرف على أي شخص لم تجد حلا حتى الآن:SQL server != الخلية.إذا كنت تريد أن تفعل ذلك مع الخلية, هو بسيط جدا

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

نشر هذا هنا لأنه ضرب أعلى في جوجل.

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

-- -- إنشاء الإجراء للتحقق مما إذا كان الجدول موجود


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);
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

إذا كان أي شخص يحاول أن يفعل نفس الشيء في linq to 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

بالنظر إلى أن لديك كائن مع اسم في خاصية تسمى البند المخطط في خاصية تسمى المخطط حيث المصدر اسم المتغير هو a

إذا كان هذا هو في نهاية المطاف المناقشة ، ثم وتجدر الإشارة إلى أن لاري ليونارد النصي يمكن الاستعلام ملقم بعيد وكذلك إذا كانت ملقمات المرتبطة.

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

عندي بعض المشاكل سواء مع اختيار من INFORMATIONAL_SCHEME و OBJECT_ID.أنا لا أعرف إذا كان إصدار من برنامج تشغيل ODBC أو أي شيء..استفسارات SQL server إدارة studio, كلا, لا بأس.

هنا هو الحل:

SELECT COUNT(*) FROM <yourTableNameHere>

حتى لو يفشل الاستعلام, هناك, ربما, لا يوجد مثل هذا الجدول في قاعدة البيانات (أو لم يكن لديك أذونات الوصول إلى ذلك).

الاختيار يتم عن طريق مقارنة قيمة (عدد صحيح في حالتي) عاد SQL المنفذ الذي يتعامل مع برنامج تشغيل ODBC..

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

تشغيل هذا الاستعلام للتحقق إذا كان الجدول موجود في قاعدة البيانات:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
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

النظر في قاعدة بيانات واحدة لديك جدول t1.كنت ترغب في تشغيل البرنامج النصي في قاعدة بيانات أخرى مثل - إذا t1 موجودة ثم لا تفعل شيئا آخر إنشاء t1.للقيام بذلك فتح visual studio ثم قم بما يلي:

انقر بزر الماوس الأيمن على t1, ثم النصي الجدول ، ثم إسقاط وخلق ، ثم استعلام جديد محرر

سوف تجد المطلوب الاستعلام.ولكن قبل تنفيذ هذا السيناريو لا تنسى التعليق من الهبوط البيان في الاستعلام كما كنت لا ترغب في إنشاء واحدة جديدة إذا كان هناك بالفعل واحدة.

شكرا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top