sql server जांचें कि SQL सर्वर में तालिका मौजूद है या नहीं




sql-server tsql (17)

मैं SQL स्टेटमेंट का उपयोग कर SQL Server 2000/2005 में कोई तालिका मौजूद है या नहीं, यह जांचने के लिए यह अंतिम चर्चा करना चाहूंगा।

जब आप उत्तर के लिए Google, तो आपको कई अलग-अलग उत्तर मिलते हैं। क्या ऐसा करने का कोई आधिकारिक / पिछड़ा और आगे संगत तरीका है?

इसे करने के दो संभावित तरीके यहां दिए गए हैं। दोनों में से कौन सा यह करने का मानक / सर्वोत्तम तरीका है?

पहला तरीका:

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 सरल शो टैबलेट '% tablename%' की तरह प्रदान करता है; बयान। मैं कुछ इसी तरह की तलाश में हूं।


बस एक ऐसी स्थिति का उल्लेख करना चाहता था जहां शायद 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;

एसक्यूएल सर्वर 2016 संपादित करें :

2016 से शुरू होने पर, माइक्रोसॉफ्ट ने छोड़ने से पहले अस्तित्वहीन वस्तुओं की जांच करने की क्षमता को सरल बना दिया, if exists बयानों को drop लिए if exists कीवर्ड 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/


IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

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

किसी ऐसे व्यक्ति के लिए जानना महत्वपूर्ण है जिसने अभी तक अपना समाधान नहीं मिला है: SQL सर्वर! = MYSQL । यदि आप इसे MYSQL के साथ करना चाहते हैं, तो यह काफी सरल है

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

इसे यहां पोस्ट करना क्योंकि यह Google पर शीर्ष हिट है।


एक डेटाबेस में विचार करें जिसमें आपके पास टेबल टी 1 है। आप अन्य डेटाबेस जैसे स्क्रिप्ट को चलाने के लिए चाहते हैं - यदि टी 1 मौजूद है तो कुछ और नहीं करें t1 बनाएं। इस खुले दृश्य स्टूडियो को करने के लिए और निम्न कार्य करें:

टी 1 पर राइट क्लिक करें, फिर स्क्रिप्ट टेबल के रूप में, फिर ड्रॉप करें और बनाएं, फिर नया क्वेरी संपादक

आपको अपनी वांछित क्वेरी मिल जाएगी। लेकिन उस स्क्रिप्ट को निष्पादित करने से पहले क्वेरी में ड्रॉप स्टेटमेंट पर टिप्पणी करना न भूलें क्योंकि आप पहले से ही एक नया निर्माण नहीं करना चाहते हैं।

धन्यवाद


यह भी ध्यान रखें कि यदि किसी भी कारण से आपको एक अस्थायी तालिका की जांच करने की आवश्यकता है तो आप यह कर सकते हैं:

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

SQL सर्वर 2000 में आप कोशिश कर सकते हैं:

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

इस तरह के प्रश्नों के लिए INFORMATION_SCHEMA व्यू का उपयोग करना हमेशा सर्वोत्तम होता है। ये विचार कई अलग-अलग डेटाबेस में (अधिकतर) मानक हैं और शायद ही कभी संस्करण से संस्करण में बदल जाते हैं।

यह जांचने के लिए कि कोई तालिका मौजूद है या नहीं:

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

डेवलपर्स और साथी डीबीए के लाभ के लिए बस यहां जोड़ना

एक स्क्रिप्ट जो पैरामीटर के रूप में @Tablename प्राप्त करती है

(जो schemaname शामिल हो सकता है या नहीं हो सकता है) और schema.table मौजूद है अगर नीचे दी गई जानकारी देता है:

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

मैंने इस स्क्रिप्ट को अन्य स्क्रिप्ट के अंदर इस्तेमाल करने के लिए हर बार इस्तेमाल किया था जब मुझे परीक्षण करने की आवश्यकता होती है कि कोई तालिका या दृश्य मौजूद है या नहीं, और जब ऐसा होता है, तो अन्य उद्देश्यों के लिए इसका ऑब्जेक्ट_आईडी उपयोग किया जाए।

जब आप एक खाली स्ट्रिंग, गलत स्कीमा नाम या गलत तालिका नाम पारित करते हैं तो यह एक त्रुटि उठाता है।

यह एक प्रक्रिया के अंदर हो सकता है और उदाहरण के लिए वापसी -1 हो सकता है।

उदाहरण के तौर पर, मेरे डेटा वेयरहाउस डेटाबेस में से एक में "फैक्ट्सफैक्टबैकऑर्डर" नामक एक टेबल है।

इस तरह मैंने इसे हासिल किया:

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 

मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर आप इसे अक्सर कॉल करने की योजना बनाते हैं तो मुझे यह संभावना मिली है।

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

एक अलग डेटाबेस पर एक टेबल की तलाश में:

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

कृपया नीचे के दृष्टिकोण देखें,

दृष्टिकोण 1: INFORMATION_SCHEMA.TABLES दृश्य का उपयोग करना

हम वर्तमान डेटाबेस में ग्राहक तालिका मौजूद है या नहीं, यह जांचने के लिए नीचे एक क्वेरी लिख सकते हैं।

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.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 सिस्टम तालिका का सीधे उपयोग करने से बचना चाहिए, इसके लिए सीधी पहुंच एसक्यूएल सर्वर के कुछ भविष्य के संस्करणों में बहिष्कृत हो जाएगी। माइक्रोसॉफ्ट बीओएल लिंक के अनुसार, माइक्रोसॉफ्ट 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/


यदि आपको विभिन्न डेटाबेस पर काम करने की आवश्यकता है:

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

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

यदि कोई भी 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

यह देखते हुए कि आपके पास आइटम नामक संपत्ति में नाम के साथ एक वस्तु है, और स्कीमा नामक संपत्ति में स्कीमा है जहां स्रोत चर नाम a


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


सूचना स्कीमा का उपयोग करना एसक्यूएल मानक तरीका है, इसलिए इसका उपयोग उन सभी डेटाबेसों द्वारा किया जाना चाहिए जो इसका समर्थन करते हैं।





tsql