টেবিলটি বিদ্যমান কিনা এবং এটি উপস্থিত না থাকলে, এসকিউএল সার্ভার ২০০৮ এ এটি তৈরি করুন


130

আমি এসকিউএল সার্ভার ২০০৮-এ একটি সঞ্চিত পদ্ধতি লিখছি। যদি তা না হয় তবে আমার এটি তৈরি করা দরকার।

আমি এটা কিভাবে করবো?


2
সম্পর্কিত, যদি নকল না: চেক যদি টেবিল SQL সার্ভার বিদ্যমান

1
এটি একটি দুর্দান্ত প্রশ্ন যা এসকিউএল সার্ভারের সাথে কাজ করা প্রত্যেকে শেষ পর্যন্ত জিজ্ঞাসা করবে। এটি দুঃখজনক যে এসকিউএল সার্ভারের বন্ধুত্বপূর্ণ ওরাকল স্টাইলটি তৈরি বা প্রতিস্থাপন নেই
দাভোস

1
মাইএসকিউএল-এর জন্য আপনি ব্যবহার করতে পারেনCREATE TABLE IF NOT EXISTS ...
জন হেন্কেল

উত্তর:


148

এটার মতো কিছু

IF  NOT EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))

BEGIN
CREATE TABLE [dbo].[YourTable](
    ....
    ....
    ....
) 

END

1
সম্মানের সাথে * ( পরিবর্তে পরিকল্পনার প্রয়োজনে) * এর পরিবর্তে একটি সূচকযুক্ত ক্ষেত্র ব্যবহার করে কিছু পরিবর্তন বিবেচনা করুন (অবজেক্ট_ইড এই টেবিলটিতে সাধারণত যে ক্ষেত্রের উল্লেখ করা হয়) টাইপের পরিবর্তে টাইপ = 'ইউ' ব্যবহার করুন (এন ' ইউ ) (কলাম _ টাইপটি টাইপ চরের এনসিআর ব্যবহার করে একটি অন্তর্নিহিত রূপান্তর ঘটায় যা প্রায়শই কার্ডিনালিটির অনুমানকারকের সাথে সমস্যা সৃষ্টি করে)if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
YeOldeDataSmythe

153

কেবল বৈপরীত্যের জন্য, আমি নিচের মত objectজেক্ট_আইডি ফাংশনটি ব্যবহার করতে চাই। এটি পড়তে কিছুটা সহজ, এবং আপনার sys.objects বনাম সিসোবজেক্টগুলি বনাম sys.all_objects বনাম sys.tables সম্পর্কে চিন্তা করার দরকার নেই। প্রাথমিক ফর্ম:

IF object_id('MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

অবশ্যই সেই নামের সাথে যদি কোনও বস্তু উপস্থিত থাকে তবে এটি "উপস্থাপক" হিসাবে প্রদর্শিত হবে । আপনি যদি কেবল টেবিলগুলি পরীক্ষা করতে চান তবে আপনার প্রয়োজন:

IF object_id('MyTable', 'U') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

এটি টেম্প টেবিলগুলির জন্যও কাজ করে:

IF object_id('tempdb.dbo.#MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

2
আমি সাধারণত ব্যবহৃত অন্যান্য পদ্ধতিটি দেখতে পাই (সিস্ট টেবিলগুলি পরীক্ষা করা) তবে এটি আকরিকটি সুস্পষ্ট এবং কমপ্যাক্ট বলে মনে হয়। গৃহীত উত্তরের চেয়ে এই পদ্ধতিটিকে পছন্দ না করার কোনও কারণ আছে কি? (যেমন বিভিন্ন ডিবি সরবরাহকারীগুলিতে এসকিউএল স্থানান্তর, গতি ইত্যাদির সাথে সামঞ্জস্যতা সম্পর্কিত সমস্যা)?
jedd.ahyoung

16

আসুন নীচের স্ক্রিপ্ট দ্বারা একটি টেবিল সহ একটি নমুনা ডাটাবেস তৈরি করুন:

CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))

পদ্ধতির 1: INFORMATION_SCHEMA.TABLES ভিউ ব্যবহার করে

বর্তমান ডাটাবেসে কোনও টিবিএলটেষ্ট টেবিল বিদ্যমান কিনা তা পরীক্ষা করতে আমরা নীচের মতো একটি কোয়েরি লিখতে পারি।

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

উপরের ক্যোয়ারী বর্তমান ডাটাবেসের সমস্ত স্কিমা জুড়ে tblTest টেবিলের অস্তিত্ব পরীক্ষা করে। এর পরিবর্তে যদি আপনি নির্দিষ্ট স্কিমা এবং নির্দিষ্ট ডেটাবেসে সারণীর অস্তিত্ব পরীক্ষা করতে চান তবে আমরা উপরের ক্যোয়ারীটি নীচের মত লিখতে পারি:

IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo'  AND TABLE_NAME = N'tblTest')
BEGIN
  PRINT 'Table Exists'
END

এই পদ্ধতির প্রসেস: INFORMATION_SCHEMA দর্শনগুলি বিভিন্ন আরডিবিএমএস সিস্টেমের মধ্যে বহনযোগ্য, তাই বিভিন্ন আরডিবিএমএসে পোর্টিংয়ে কোনও পরিবর্তন প্রয়োজন হয় না।

পদ্ধতির 2: OBJECT_ID () ফাংশন ব্যবহার করে

OBJECT_ID()বর্তমান ডাটাবেসে কোনও টিবিএলটেষ্ট টেবিল বিদ্যমান কিনা তা পরীক্ষা করতে আমরা নীচের মতো ফাংশন ব্যবহার করতে পারি ।

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

সারণির নামের জন্য ডেটাবেস নাম এবং স্কিমা নাম অংশ নির্দিষ্ট করা alচ্ছিক। তবে ডেটাবেস নাম এবং স্কিমা নাম উল্লেখ করে সমস্ত স্কিমা জুড়ে বর্তমান ডাটাবেসে পরীক্ষা করার পরিবর্তে নির্দিষ্ট ডাটাবেসে এবং নির্দিষ্ট স্কিমার মধ্যে সারণির অস্তিত্ব পরীক্ষা করার জন্য একটি বিকল্প সরবরাহ করা হয়। ক্যোয়ারী শো যে যদিও বর্তমান ডাটাবেসের শ্রীরামকৃষ্ণ ডাটাবেস, আমরা অস্তিত্ব পরীক্ষা করতে পারবেন নিচের tblTestটেবিল dboএ স্কিমা Testডাটাবেস।

USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END

পেশাদাররা: মনে রাখা সহজ OBJECT_ID()ফাংশন সম্পর্কে উল্লেখ করার জন্য অন্য একটি উল্লেখযোগ্য বিষয় হ'ল: এটি বর্তমান সংযোগ প্রসঙ্গে তৈরি করা অস্থায়ী সারণীর অস্তিত্ব যাচাইয়ের জন্য একটি বিকল্প সরবরাহ করে। অন্যান্য সমস্ত পন্থা কেবলমাত্র বর্তমান সংযোগ প্রসঙ্গে পরিবর্তে সমস্ত সংযোগ প্রসঙ্গে জুড়ে তৈরি অস্থায়ী সারণীর অস্তিত্ব পরীক্ষা করে। OBJECT_ID()ক্রিয়াকলাপের সাহায্যে অস্থায়ী সারণীর অস্তিত্ব কীভাবে পরীক্ষা করা যায় তা নীচের প্রশ্নের মাধ্যমে দেখানো হয়েছে :

CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END
GO

পদ্ধতির 3: সিস.অবজেক্টস ক্যাটালগ ভিউ ব্যবহার করে

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

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
  PRINT 'Table Exists'
END

পদ্ধতির 4: সিস. টেবিলগুলি ক্যাটালগ ভিউ ব্যবহার করে

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

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

Sys.Tablesক্যাটালগ ভিউ ক্যাটালগ ভিউ থেকে সারিগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় Sys.Objects, Sys.objectsক্যাটালগ ভিউটি বেস ভিউ হিসাবে sys.Tablesউল্লেখ করা হয় যেখানে উত্পন্ন ভিউ হিসাবে উল্লেখ করা হয়। Sys.Tablesকেবল সারণি অবজেক্টের জন্য সারিগুলি ফিরিয়ে দেবে যেখানে Sys.Objectটেবিলের বস্তুগুলির জন্য সারিগুলি ফিরিয়ে দেওয়া ছাড়া এটি বস্তুর জন্য সারিগুলি প্রদান করে: সঞ্চিত পদ্ধতি, দর্শন ইত্যাদি

পদ্ধতির 5: সিসি.সোসোবজেক্টস সিস্টেম সারণীটি ব্যবহার করা এড়ানো উচিত

আমাদের sys.sysobjectsসিস্টেম টেবিলটি সরাসরি ব্যবহার করা এড়ানো উচিত , এটির সরাসরি অ্যাক্সেসটি এসকিএল সার্ভারের কিছু ভবিষ্যতের সংস্করণগুলিতে হ্রাস করা হবে। [মাইক্রোসফ্ট বিএল] [১] লিঙ্ক অনুসারে, মাইক্রোসফ্ট সিস্টেম সিস্টেমের টেবিলের sys.objects/sys.tablesপরিবর্তে ক্যাটালগ ভিউগুলি sys.sysobjectsসরাসরি ব্যবহার করার পরামর্শ দিচ্ছে ।

IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' 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/


গুরুত্বপূর্ণ লক্ষণীয় যে এই উত্তরটি প্রদান করে যে কোন পদ্ধতির জন্য ডেটাবেস নির্দিষ্ট করা দরকার এবং কোনটি নয়। এটি অত্যন্ত মূল্যবান এবং স্ক্রিপ্টগুলির জন্য যেগুলি চালিত একই ডাটাবেসের একাধিক উপস্থিতিতে যখন কোনও অপারেশনাল ডাটাবেস সেটআপ এবং আপডেট করতে চালিত হয়, এটি কী! দুর্দান্ত তথ্য।
Nelda.techspiress

11

সম্পাদিত

আপনি অস্তিত্ব পছন্দসই টেবিল পরীক্ষা করার জন্য sys.tables অনুসন্ধান করতে পারেন :

IF  NOT EXISTS (SELECT * FROM sys.tables
WHERE name = N'YourTable' AND type = 'U')

BEGIN
CREATE TABLE [SchemaName].[YourTable](
    ....
    ....
    ....
) 

END


1
Declare @Username varchar(20)
Set @Username = 'Mike'

if not exists 
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')

Begin
    Create table tblEmp (ID int primary key, Name varchar(50))
    Print (@Username + ' Table created successfully')
End

Else

Begin
    Print (@Username + ' : this Table Already exists in the database')
End

1
স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। প্রশ্নের উত্তর দেওয়ার সময়, একটি ব্যাখ্যা যুক্ত করার বিষয়টিও বিবেচনা করুন। কোড একা বেশিরভাগ সময় খুব সহায়ক হয় না।
ভিক্টর

0

ডাটাবেসে কোনও সারণীর অস্তিত্বের জন্য নিম্নলিখিত বিবৃতিটি ব্যবহার করে দেখুন:

If not exists (select name from sysobjects where name = 'tablename')

আপনি যদি ব্লকের ভিতরে টেবিল তৈরি করতে পারেন।


3
যদিও সিনট্যাক্সটি কাজ করবে, sysobjectsএটি একটি সামঞ্জস্যতা দর্শন যা কেবলমাত্র পুরানো কোডটি ভাঙ্গা এড়ানোর জন্য বিদ্যমান। আমার পরামর্শ সিস্টেম ক্যাটালগ মতামত (যেমন হবে sys.objects, sys.tablesকোডের জন্য) যে শুধুমাত্র SQL সার্ভার লক্ষ্য হবে 2008 দৃষ্টান্ত, এবং তথ্য স্কিমা মতামত (যেমন information_schema.tablesকোডের জন্য) যে চাহিদা পোর্টেবল যাবে। আপনি এখানে বিভিন্ন দর্শনে আরও তথ্য পেতে পারেন: এসকিউএল সার্ভার সিস্টেম ক্যাটালগের অনুসন্ধান করা হচ্ছে
আজ

-2

আমি যদি ভুল না করি তবে এটি কাজ করা উচিত:

    if not exists (Select 1 from tableName)
create table ...

2
টেবিলটি বিদ্যমান থাকলেও খালি থাকলে কী হবে, এই ক্ষেত্রে এটি সত্য হবে
এসকিউএলমেনেস

@ এসকিউএলমেন্স ওহ ঠিক আছে, আমি আপনার উত্তর থেকে বুঝতে পেরেছি যে আপনি সিস.ওবজেক্টে 'ইউ' টাইপটি পরীক্ষা করছেন, আপনি কি আমাকে বুঝতে সাহায্য করতে পারেন, আপনি কেন এটি সুপারিশ করেন? এবং অন্য কোথাও একটি টেবিলের অস্তিত্ব থাকতে পারে? আপনাকে অগ্রিম ধন্যবাদ
রাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.