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




sql-server tsql (15)

    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

https://code.i-harness.com

এসকিউএল স্টেটমেন্ট ব্যবহার করে SQL সার্ভার 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;

MySQL সহজ উপলব্ধ করা হয়

SHOW TABLES LIKE '%tablename%'; 

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


- একটি টেবিল বিদ্যমান কিনা তা পরীক্ষা করার পদ্ধতি তৈরি করুন

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

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

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

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


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

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

আপনি আপনার পছন্দসই প্রশ্নের পাবেন। কিন্তু সেই স্ক্রিপ্টটি কার্যকর করার আগে আপনি যদি একের পর এক নতুন তৈরি করতে না চান তবে প্রশ্নটিতে ড্রপ বিবৃতিটি মন্তব্য করতে ভুলবেন না।

ধন্যবাদ


একটি ভিন্ন ডাটাবেসের উপর একটি টেবিল খুঁজছেন:

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

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

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

ডেভেলপার এবং সহযোগী DBAs এর সুবিধার জন্য এখানে যুক্ত করুন

একটি স্ক্রিপ্ট যা প্যারামিটার হিসাবে @Tablename পায়

(যা স্কাইনাম নাম ধারণ করে নাও থাকতে পারে) এবং schema.table বিদ্যমান থাকলে নীচের তথ্যটি ফেরত দেয়:

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

আমি এই স্ক্রিপ্টটিকে অন্য স্ক্রিপ্টের ভিতরে ব্যবহার করার জন্য প্রস্তুত করি যখন প্রত্যেক টেবিলে বা ভিউ বিদ্যমান কিনা তা পরীক্ষা করার প্রয়োজন হয় এবং যখন এটি হয়, তখন অন্যান্য বস্তুর জন্য এটি object_id ব্যবহার করা যায়।

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

এটি একটি পদ্ধতির ভিতরে এবং উদাহরণস্বরূপ ফেরত -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,@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 

যতক্ষণ আমি মনে করি আমরা সর্বদা OBJECT_ID শৈলীটি ব্যবহার করি

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

যদি কেউ linq (বা বিশেষ করে 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


শুধু একটি পরিস্থিতি উল্লেখ করতে চেয়েছিলেন যেখানে এটি সম্ভবত 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 সম্পাদনা :

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

drop table if exists mytablename

কোড 1 লাইনে OBJECT_ID / INFORMATION_SCHEMA wrappers হিসাবে একই জিনিস করবে।

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


SQL সার্ভার 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 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