টেবিলটি এসকিউএল সার্ভারে বিদ্যমান কিনা তা পরীক্ষা করুন


1142

এসকিউএল স্টেটমেন্টগুলি ব্যবহার করে এসকিউএল সার্ভার 2000/2005 এ কোনও টেবিলের উপস্থিতি রয়েছে কিনা তা যাচাই করা যায় কিনা তা সম্পর্কে আমি চূড়ান্ত আলোচনা হতে চাই।

যখন আপনি উত্তরটির জন্য গুগল করেন, আপনি এতগুলি আলাদা উত্তর পেয়ে যান। এটি করার কোনও অফিসিয়াল / পশ্চাৎপদ এবং সামনের দিকে সামঞ্জস্যপূর্ণ উপায় আছে কি?

এটি করার দুটি সম্ভাব্য উপায় এখানে। দুজনের মধ্যে কোনটি এটির আদর্শ / সর্বোত্তম উপায়?

প্রথম উপায়:

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%'; 

বিবৃতি। আমি অনুরূপ কিছু খুঁজছি।


1
Sys.tables এর পরিবর্তে INFORMATION_SCHEMA.TABLES ব্যবহার করা ভাল কেন তারপরে কোনও নাম টাইপ_ডেস্ক মান চেক যুক্ত করে ফিল্টার আউট করা উচিত?
দান্তে স্মিথ

উত্তর:


1331

এই জাতীয় প্রশ্নের জন্য একটি INFORMATION_SCHEMAভিউ ব্যবহার করা সর্বদা সেরা । এই মতামতগুলি (বেশিরভাগ) বিভিন্ন ভিন্ন ডাটাবেস জুড়ে মানক এবং খুব কমই সংস্করণ থেকে সংস্করণে পরিবর্তিত হয়।

কোনও টেবিল বিদ্যমান রয়েছে কিনা তা পরীক্ষা করতে:

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

12
দুর্দান্ত কাজ! টি-এসকিউএলে (মূল পোস্টারের প্রতিক্রিয়া হিসাবে), যদিও এটি TABLE_SCHEMA, SCHEMA_NAME নয়। ভকভগক.
নিকোলাস পাইসেকি

10
প্রদত্ত যে একাকী কোনও বস্তুর নাম (এটি কোনও স্কিমা ব্যতীত) অনন্য হওয়ার গ্যারান্টিযুক্ত নয়, এটি করার জন্য কোনও 100% ব্যর্থতা নেই। যদি আপনি এমন কোনও ডিবি নিয়ে কাজ করছেন যা স্কিমার জুড়ে নামকরণের বিরোধ নেই তবে কেবল "TABLE_SCHEMA = 'TheSchema'" বাদ দেওয়া ঠিক কাজ করবে।
আকমাদ

26
অস্থায়ী টেবিলটি পরীক্ষা করতে, আমাদের টেম্পডিবি ডাটাবেসটি জিজ্ঞাসা করতে হবে এবং টেবিলের নামটির জন্য একটি লাইক অপারেটর ব্যবহার করতে হবেSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
পিয়ারে-আলাইন ভিগ্যান্ট

4
নীচে একটি প্রতিক্রিয়া যা ওবিজেইসিআইডি ফাংশনটি ব্যবহার করে প্রতি সংযোগ টেম্প টেবিলগুলি সম্পর্কে সঠিকভাবে কাজ করে - stackoverflow.com/a/2155299/16147
ধনী রুসো

4
@akmad এসকিউএল কোয়েরি সংকলক কোয়েরি চালানোর আগে টেবিলটি পরীক্ষা করবে এবং এমনকি শুরু করার আগেই ব্যর্থ হবে।
মার্ক কে

278

এছাড়াও নোট করুন যে কোনও কারণে যদি আপনাকে অস্থায়ী টেবিলের জন্য পরীক্ষা করতে হয় তবে আপনি এটি করতে পারেন:

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

10
এই পদ্ধতিটি ব্যবহার করে টেম্প টেবিলগুলির প্রতি সংযোগের প্রকৃতির প্রতি শ্রদ্ধাশীল বলে মনে হচ্ছে। পূর্ববর্তী পোস্ট করা INFORMATION_SCHEMA ক্যোয়ারী সারণী তৈরি করে এমন সংযোগ নির্বিশেষে সারিগুলি ফিরিয়ে দেবে।
ধনী রুসো

238

আমি OBJECT_IDযতক্ষণ মনে করি ততক্ষণ স্টাইল ব্যবহার করি

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

16
আমি বিশ্বাস করি এটি দ্রুত হবে যদিও খুব বহনযোগ্য নয়। মানক সমর্থন করে এমন কোনও ডিবিআরএমএসে তথ্যের স্কিমা দর্শনগুলির নিশ্চয়তা রয়েছে। তদ্ব্যতীত, সরল OBJECT_ID অবজেক্টের কোনও সারণির গ্যারান্টি দেয় না।
জো পাইনেদা

9
ধন্যবাদ জো, আমি ভাবছিলাম যে আপনি কেন OBJECT_ID বনাম INFORMATION_SCHEMA.TABLES বনাম sys.tables ব্যবহার করবেন। উল্লেখ করে যে INFORMATION_SCHEMA একটি স্ট্যান্ডার্ড এর অংশ যে বেশিরভাগ প্রশ্নের উত্তর। বিটিডাব্লু এটা মজাদার, আমাদের ডাটাবেস বিশেষজ্ঞদের মধ্যে যে আমি এই প্রশ্নটি জিজ্ঞাসা করতে যাচ্ছিলাম তার একই শেষ নাম আপনার মতো, অবশ্যই ডাটাবেসের জন্য একটি ভাল শেষ নাম হতে হবে।
অপিওরন

24
@ জোপিনেডা: তারপরে আপনি OBJECT_ID('TableName', 'U')গ্যারান্টিটি ব্যবহার করে এই জিনিসটি একটি টেবিল।
অ্যালন গুরালেনেক

1
@ অ্যালনগুরালেনেক, সুতরাং কোনও সাধারণ এবং বহনযোগ্য মান অনুসরণ করার পরিবর্তে ক্রিপ্টিক তথ্যের একটি অতিরিক্ত টুকরো যুক্ত করবেন?
সংজ্ঞায়িত করেছে

22
@ ডাস্টিনফাইনআউট: প্রশ্নটি tsql ট্যাগ করা হয়েছিল , সুতরাং বহনযোগ্যতা ততটা প্রয়োগ হয় না। সাধারণভাবে আমি খুব কম সংখ্যক সত্যই পোর্টেবল কোডবেসের মুখোমুখি হয়েছি এবং যদি সংযোগের মূল্য নির্ধারণ করা হয় তবে এটি নিশ্চিতভাবে বার বার IF EXISTSগৃহীত উত্তর থেকে সেই ক্যোয়ারীটি লিখবে । এছাড়াও, ডকুমেন্টেশনগুলি বিশেষত টি-এসকিউএল (বা অন্য কোনও রূপে, সত্যিই) পড়া না হওয়া অবধি সবকিছু গুপ্ত থাকে।
অ্যালন গুরালেক

132

দয়া করে নীচের পন্থাগুলি দেখুন,

পদ্ধতির 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: সিস.অবজেক্টস ক্যাটালগ ভিউ ব্যবহার করে

নীচের চিত্রের মতো সারণীর অস্তিত্ব যাচাই করতে আমরা সিস.অবজেক্ট ক্যাটালগ ভিউটি ব্যবহার করতে পারি:

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: সিস. টেবিলগুলি ক্যাটালগ ভিউ ব্যবহার করে

নীচের চিত্রের মতো সারণীর অস্তিত্ব যাচাই করতে আমরা সিস টেবিলের ক্যাটালগ ভিউটি ব্যবহার করতে পারি:

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

পদ্ধতির 5: সিসি.সোসোবজেক্টস সিস্টেম সারণী ব্যবহার করা থেকে বিরত থাকুন

আমাদের সরাসরি সিস.সাইবোজেক্টস সিস্টেম সারণী ব্যবহার করা এড়ানো উচিত, এটির সরাসরি অ্যাক্সেসটি এসকিএল সার্ভারের কিছু ভবিষ্যতের সংস্করণগুলিতে হ্রাস করা হবে। মাইক্রোসফ্ট বিওএল লিঙ্ক অনুসারে, মাইক্রোসফ্ট সরাসরি সিস্টেমে সিস্টেম সারণির পরিবর্তে ক্যাটালগের দৃশ্যগুলি 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/



26

কেবল একটি পরিস্থিতি উল্লেখ করতে চেয়েছিলেন যেখানে সম্ভবত OBJECT_IDপদ্ধতিটি ব্যবহার করা কিছুটা সহজ হবে । INFORMATION_SCHEMAমতামত প্রতিটি database- অধীনে বস্তু

তথ্য স্কিমা দর্শনগুলি 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;

এসকিউএল সার্ভার ২০১ Edit সম্পাদনা করুন :

২০১ with সালে শুরু করে, মাইক্রোসফ্ট বিবৃতিতে if existsকীওয়ার্ড যুক্ত করে নামার আগে অস্তিত্বহীন বস্তুগুলির জন্য যাচাই করার ক্ষমতা সহজ করে তুলেছিল drop। উদাহরণ স্বরূপ,

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/



13

তথ্য স্কিমা ব্যবহার করা এটি করার জন্য এসকিউএল স্ট্যান্ডার্ড উপায়, সুতরাং এটি সমর্থন করে এমন সমস্ত ডাটাবেস ব্যবহার করা উচিত।


12
এটি একটি মন্তব্য করা উচিত ছিল।
আন্ডারস্কোর_

3
এই উত্তরের উন্নতি প্রয়োজন।
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

উপরের কোডে এখানে টেবিলের নাম Mapping_APCToFANavigator


2
আপনি যদি কোড, এক্সএমএল বা ডেটা নমুনাগুলি পোস্ট করেন তবে দয়া করে টেক্সট সম্পাদকের সেই লাইনগুলি হাইলাইট { }করুন এবং এডিটর টুলবারের "কোড স্যাম্পল" বোতামটিতে ক্লিক করুন: সুন্দরভাবে ফর্ম্যাট করতে এবং সিনট্যাক্সটিকে হাইলাইট করুন!
marc_s

1
নোট করুন যে এসকিউএল সার্ভারের ভবিষ্যতের সংস্করণে সিস্টেম টেবিলগুলিতে অ্যাক্সেস বন্ধ হয়ে যেতে পারে। পরিবর্তে স্কিমা দর্শন ব্যবহার করুন।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

10

আপনার যদি বিভিন্ন ডাটাবেসে কাজ করতে হয়:

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
তুমি কি নিশ্চিত? আমার 2005 বাক্সে তথ্য স্কিমা কেবল বর্তমান ক্যাটালগটি দেয়।
কুইলব্রেকার

8

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আপনি যদি প্রায়শই ফোন করার পরিকল্পনা করেন তবে আমি এই সম্ভাবনাটি পেয়েছি।

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

9
-1। এটির জন্য একটি প্রক্রিয়াযুক্ত অর্থহীন কারণ এটি কলটি কল করতে এবং রিটার্নটি গ্রাহ্য করার জন্য যতটা সহজ নির্বাচন করতে হয় তেমন কোড। sysnameডেটাটাইপ ব্যবহার করা উচিত নয় varchar(50)। অবহেলিত sysobjectsদর্শন ব্যবহার করা উচিত নয় এবং স্কিমার কোনও অ্যাকাউন্ট নেয় না।
মার্টিন স্মিথ

6

আপনি নীচের কোড ব্যবহার করতে পারেন

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

অথবা

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

5

বিকাশকারী এবং সহযোগী ডিবিএর সুবিধার জন্য এখানে কেবল যুক্ত করা হচ্ছে

একটি স্ক্রিপ্ট যা পরামিতি হিসাবে @ টেবিলনামটি গ্রহণ করে

(যার মধ্যে স্কিমেনেম থাকতে পারে এবং নাও থাকতে পারে) এবং স্কিমা.ট্যাব উপস্থিত থাকলে নীচের তথ্যটি প্রদান করে:

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

আমি এই স্ক্রিপ্টটি অন্য স্ক্রিপ্টগুলির অভ্যন্তরে ব্যবহারের জন্য তৈরি করেছি যখনই আমার টেবিলে বা ভিউ রয়েছে কি না তা পরীক্ষা করে দেখার দরকার হয় এবং যখন এটি হয় তখন এর উদ্দেশ্য_আইডটিকে অন্য উদ্দেশ্যে ব্যবহার করার জন্য পেতে পারি।

আপনি খালি স্ট্রিং, ভুল স্কিমা নাম বা ভুল সারণীর নাম পাস করলে এটি একটি ত্রুটি উত্থাপন করে।

এটি কোনও পদ্ধতির অভ্যন্তরে থাকতে পারে এবং উদাহরণস্বরূপ -1 ফেরত যেতে পারে।

উদাহরণ হিসাবে, আমার একটি ডেটা গুদাম ডাটাবেসে "Facts.FactBackOrder" নামে একটি টেবিল রয়েছে table

এইভাবেই আমি এটি অর্জন করেছি:

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 

আপনার স্ক্রিপ্টে প্রচুর অনুমান রয়েছে। উদাহরণস্বরূপ, আমি সহজেই নামের একটি সারণী তৈরি করতে পারি dbo.[hello.world ]এবং স্ক্রিপ্টটি একাধিক কারণে এটি খুঁজে পেতে পারে না। এটি বলেছিল, এরকম সম্ভাবনা যে কেউ এ জাতীয় টেবিল তৈরি করতে চান তবে এখনও still যাইহোক, আপনার THE_NAMEকলামটি sysname', yet you try to squeeze 2 sysname` কলাম এবং একটি বিন্দু ( .) হিসাবে সংজ্ঞায়িত করা হয়েছে , সমস্ত সেখানে বর্গাকার বন্ধনী দ্বারা বেষ্টিত ... যে কোনও একদিন ব্যর্থ হতে বাধ্য!
ডিসোবি

@ এরোবি আমি সম্মত হচ্ছি যে সিমনাম ব্যবহার করা সবচেয়ে ভাল ডেটা টাইপ নয়, তবুও স্ক্রিপ্টটি দীর্ঘকাল ধরে কোনও ত্রুটি ছাড়াই চলছিল, আমি যদি সেখানে যুক্তিসঙ্গত পরিস্থিতি খুঁজে পাই তবে এটির জন্য সময় ব্যয় করব it আরও ভাল, আপনি এই কোডটি গ্রহণ করুন, এটি উন্নত করুন এবং উত্তর হিসাবে এটি এখানে পোস্ট করুন এবং আমি এটি পরীক্ষা করব, যদি এটি কাজ করে তবে আমি আপনার উত্তরটিকে উজ্জীবিত করব।
মার্সেলো মিয়োরেলি

5

ইন SQL সার্ভার 2000 আপনি চেষ্টা করতে পারেন:

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

যে কেউ এখনও তাদের সমাধানটি খুঁজে পায় নি তার জন্য জানা গুরুত্বপূর্ণ: এসকিউএল সার্ভার! = এমওয়াইএসকিউএল । আপনি যদি এটি 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";

এটি এখানে পোস্ট করা কারণ এটি গুগলে শীর্ষ হিট।


4
-1 কারণ ওপি নিখুঁতভাবে মাইএসকিউএল নয়, সমস্যার এসকিউএল সার্ভার সমাধানের জন্য জিজ্ঞাসা করছে। তিনি মাইএসকিউএল সম্পর্কে লিখেছিলেন কারণ তিনি সেই ডিবিএমএসের সমাধান জানেন এবং এসকিউএল সার্ভারেও তিনি একই ফলাফল চেয়েছিলেন। এছাড়াও আপনার উত্তর এমনকি একটি মাইএসকিউএল কোয়েরি নয়, তবে একটি পিএইচপি কোড যা মাইএসকিউএল সহ কাজ করে।
mordack550

1
@ মোর্ডাক ৫৫০, আমি ব্লাউহিরনের সাথে একমত। সে সঠিক. এসকিউএল-তে কোনও টেবিল রয়েছে কিনা তা খুঁজে বের করার জন্য এটি গুগলের শীর্ষস্থানীয়। তার উদ্দেশ্য ভাল এবং তার তথ্য সহায়ক। +1
চিহ্নিত করুন

দুর্ভাগ্যজনক যে মাইক্রোসফ্টের এসকিউএল এর মতো সাধারণ মান এবং নিদর্শনগুলিকে আলিঙ্গন / প্রসারিত / নিভিয়ে দেওয়ার চেষ্টা করার অভ্যাস রয়েছে। আমি সত্যই কামনা করি তারা একটি এসকিউএল সার্ভারের তাদের প্রয়োগের একটি যথাযথ নাম দিয়েছিল যাতে লোকেরা তাদের পণ্যের সাথে নির্দিষ্ট উল্লেখগুলি নির্বিঘ্নে সনাক্ত করতে পারে।
psaxton


2

আপনি এটি ব্যবহার করতে পারেন:

     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

- - কোনও সারণী রয়েছে কিনা তা পরীক্ষা করার জন্য পদ্ধতি তৈরি করুন


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


1

আমি উদাহরণ হিসাবে এখানে একটি ভিউ তৈরি

কারণ ALTER / CREATE কমান্ডগুলি BEGIN / END ব্লকের মধ্যে থাকতে পারে না। আপনার তৈরি করার আগে আপনাকে অস্তিত্বের জন্য পরীক্ষা করতে হবে এবং ড্রপ করুন

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

GO

CREATE VIEW TestView
   as
   . . .

GO

যদি আপনি অনুমতিগুলি হারিয়ে যাওয়ার বিষয়ে উদ্বিগ্ন থাকেন তবে আপনি অনুদানের বিবৃতিগুলিও স্ক্রিপ্ট করতে পারেন এবং সেগুলি আবার চালাতে পারেন।

আপনি কোনও স্ট্রিংতে তৈরি / পরিবর্তনটি মোড়ানো করতে পারেন এবং একটি এক্সইসি করতে পারেন - এটি বড় দর্শনগুলির জন্য কুৎসিত হতে পারে

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

যদি কেউ লিনাক টু এসকিএল (বা বিশেষত লিনকপ্যাড) এ একই জিনিসটি করার চেষ্টা করে থাকে তবে সিস্টেম টেবিল এবং ভিউগুলি অন্তর্ভুক্ত করার জন্য এই বিকল্পটি চালু করুন এবং এই কোডটি করুন:

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


0

এটি যদি 'চূড়ান্ত' আলোচনার বিষয় হতে হয়, তবে এটি লক্ষ করা উচিত যে ল্যারি লিওনার্ডের স্ক্রিপ্ট সার্ভারগুলি সংযুক্ত থাকলে সেই সাথে একটি রিমোট সার্ভারকেও জিজ্ঞাসা করতে পারে।

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

এটি লিওনার্ডস উত্তরের মন্তব্য হিসাবে বা সম্ভবত সম্পাদনা হিসাবে যুক্ত করার পক্ষে এটি আরও উপযুক্ত?
EWit

0

INFORMATIONAL_SCHEME এবং OBJECT_ID থেকে নির্বাচন করে আমার কিছু সমস্যা হয়েছে। আমি জানি না এটি ওডিবিসি ড্রাইভারের কোনও সমস্যা বা কোনও কিছুর .. এসকিউএল পরিচালনার স্টুডিওর প্রশ্নগুলি, উভয়ই ঠিক ছিল।

সমাধান এখানে:

SELECT COUNT(*) FROM <yourTableNameHere>

সুতরাং, যদি কোয়েরিটি ব্যর্থ হয়, সম্ভবত, ডাটাবেসটিতে এই জাতীয় কোনও টেবিল নেই (বা আপনার এতে অ্যাক্সেসের অনুমতি নেই)।

এসকিউএল এক্সিকিউটারের দ্বারা প্রাপ্ত মান (আমার ক্ষেত্রে পূর্ণসংখ্যার) সাথে তুলনা করে চেকটি করা হয় যা ওডিবিসি ড্রাইভারের সাথে সম্পর্কিত ...

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

কি আউটপুট সঙ্গে ব্যর্থ?
wscourge 22'19

@Wscourge, এসকিউএল কোয়েরি ব্যর্থ হয়েছে বা এর মতো কিছু something আমি কেবল এক্সিকিউটার ফাংশন থেকে রিটার্ন মানটি পরীক্ষা করি।
মাইকেল কোয়াড

এটি আপনার উত্তরে যুক্ত করুন
6'22 এ wscourge করুন

0

টেবিলটি ডাটাবেসগুলিতে বিদ্যমান কিনা তা পরীক্ষা করার জন্য আরও একটি বিকল্প রয়েছে

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

টেবিলটি ডাটাবেসে উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে এই কোয়েরিটি চালান:

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

-6

একটি ডাটাবেসে বিবেচনা করুন আপনার একটি টেবিল টি 1 রয়েছে। আপনি অন্যান্য ডেটাবেসে স্ক্রিপ্ট চালাতে চান - যদি টি 1 থাকে তবে টি 1 তৈরি করে অন্য কিছু করবেন না। এই ওপেন ভিজ্যুয়াল স্টুডিওটি করতে এবং নিম্নলিখিতগুলি করতে:

টি 1 তে রাইট ক্লিক করুন, তারপরে স্ক্রিপ্ট টেবিল, তারপরে DROP এবং তৈরি করুন, তারপরে নিউ ক্যোয়ারী সম্পাদক

আপনি আপনার পছন্দসই কোয়েরি পাবেন find তবে সেই স্ক্রিপ্টটি কার্যকর করার আগে ক্যোয়ারীতে ড্রপ স্টেটমেন্টটি মন্তব্য করতে ভুলবেন না কারণ আপনি ইতিমধ্যে যদি একটি নতুন থাকে তবে আপনি এটি নতুন তৈরি করতে চান না।

ধন্যবাদ


এসএসএমএস ২০১২-এ এটি আর-উপস্থিত চেকটি আর সম্পাদন করে না, যদি এটি কখনও করে থাকে (তবে পূর্ববর্তী সংস্করণগুলি কীভাবে উপরের স্ক্রিপ্টটি উত্পন্ন করেছিল তা আমার মনে নেই)। অন্যান্য ডিবি সরঞ্জাম যেভাবে টেবিলের জিনিসগুলি স্ক্রিপ্ট করছে তাতে আপনি ভুল করছেন?
Ivaylo স্লাভভ

আপনি যদি জিজ্ঞাসা করেন তবে এসএসএমএস যদি অস্তিত্বের চেকটি সম্পাদন করে। সরঞ্জামসমূহ> বিকল্পগুলি> এসকিউএল সার্ভার অবজেক্ট এক্সপ্লোরার> স্ক্রিপ্টিং> "বস্তুর স্ক্রিপ্টিং বিকল্পগুলি": "বস্তুর অস্তিত্বের জন্য পরীক্ষা করুন" = সত্য
সান আলেকজান্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.