sql server অবশ কিভাবে একটি কলাম একটি SQL সার্ভার টেবিল বিদ্যমান কিনা তা পরীক্ষা করবেন?




ধৈর্য সম্পর্কে হাদিস (24)

যদি এটি বিদ্যমান না থাকে তবে আমি একটি নির্দিষ্ট কলাম যুক্ত করতে হবে। আমি নিম্নলিখিত মত কিছু আছে, কিন্তু এটা সবসময় মিথ্যা ফেরত:

IF EXISTS(SELECT *
          FROM   INFORMATION_SCHEMA.COLUMNS
          WHERE  TABLE_NAME = 'myTableName'
                 AND COLUMN_NAME = 'myColumnName') 

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

https://code.i-harness.com


অনুসন্ধানের কলাম বিদ্যমান কিনা বা টেবিলে নেই কিনা তা অনুসন্ধানের জন্য অনুসন্ধানের নীচে ব্যবহার করা যেতে পারে। নীচের দেখানো অনুসন্ধান ফলাফলের ভিত্তিতে আমরা সিদ্ধান্ত নিতে পারি।

IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <YourTableName> AND COLUMN_NAME = <YourColumnName>)
  BEGIN
    SELECT 'Column Already Exists.'
  END
  ELSE
  BEGIN
    ALTER TABLE <YourTableName> ADD <YourColumnName> <DataType>[Size]
  END

আপনার নির্দিষ্ট প্রয়োজনীয়তা অনুসারে নীচের টিকিট:

if not exists (select
                     column_name
               from
                     INFORMATION_SCHEMA.columns
               where
                     table_name = 'MyTable'
                     and column_name = 'MyColumn')
    alter table MyTable add MyColumn int

প্রশ্নের সাথে সম্পাদনা করতে সম্পাদনা করুন : এটি কাজ করা উচিত - মূঢ় ভুলের জন্য আপনার কোডের উপর সতর্কতার সাথে নজর রাখুন; উদাহরণস্বরূপ আপনার সন্নিবেশ প্রয়োগ করা হচ্ছে এমন একই ডাটাবেসের মধ্যে আপনি INFORMATION_SCHEMA কে জিজ্ঞাসা করছেন? আপনার টেবিলে / কলামের নামের মধ্যে টাইপ আছে কিনা?


আপনি আগ্রহী এমন টেবিলে সম্পর্কে অনেক কিছু খুঁজে পেতে তথ্য স্কিমা সিস্টেমের দৃশ্যগুলি ব্যবহার করতে পারেন:

SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME = 'yourTableName'
 ORDER BY ORDINAL_POSITION

আপনি Info_schema মতামত ব্যবহার করে ডাটাবেস সম্পর্কে মতামত, সংরক্ষিত পদ্ধতি এবং বেশিরভাগ কিছু জিজ্ঞাসা করতে পারেন।


আমি একটি সিস্টেম টেবিলের উপর INFORMATION_SCHEMA.COLUMNS পছন্দ করি কারণ মাইক্রোসফ্ট সংস্করণগুলির মধ্যে সিস্টেম সারণী সংরক্ষণ করার গ্যারান্টি দেয় না। উদাহরণস্বরূপ, dbo.syscolumns এখনও SQL 2008 তে কাজ করে, তবে এটি বাতিল করা হয় এবং ভবিষ্যতে যেকোনো সময় সরানো যেতে পারে।


আমি এসকিউএল সার্ভার 2000 এর জন্য অনুরূপ এবং @ মিচ পয়েন্ট হিসাবে, এটি শুধুমাত্র INM 2005+ কাজ করে।

এটা অন্য কেউ সাহায্য করা উচিত, এই শেষ পর্যন্ত আমার জন্য কি কাজ করেছে:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')

আরো সংক্ষিপ্ত সংস্করণ

IF COL_LENGTH('table_name','column_name') IS NULL
BEGIN
/* Column does not exist or caller does not have permission to view the object */
END

মেটাডেটা দেখার অনুমতি সম্পর্কে বিন্দু শুধু এই নয় সমস্ত উত্তরগুলিতে প্রযোজ্য।

উল্লেখ্য যে COL_LENGTH প্রথম পরামিতি টেবিল নাম প্রয়োজন COL_LENGTH এক, দুই, বা তিনটি অংশ নাম ফর্ম্যাট হতে পারে।

একটি পৃথক ডাটাবেস একটি টেবিল উল্লেখ একটি উদাহরণ

COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')

মেটাডেটা মতামত ব্যবহার করার তুলনায় এই উত্তরের সাথে একটি পার্থক্য হল যে COL_LENGTH মতো মেটাডেটা ফাংশনগুলি সর্বদা বিচ্ছিন্নতার মাত্রা ব্যতীত প্রতিশ্রুতিবদ্ধ পরিবর্তনের ডেটা ফিরিয়ে দেয়।


একটি কলাম অস্তিত্ব পরীক্ষা করার বিভিন্ন উপায় আছে। ব্যবহারকারীর সাথে যোগাযোগ করার জন্য আমি দৃঢ়ভাবে সুপারিশ করব যে এটি INFORMATION_SCHEMA.COLUMNS ব্যবহার করার জন্য তৈরি করা হয়েছে। নিম্নলিখিত টেবিল বিবেচনা করুন:

 sys.objects
 sys.columns

এবং এমনকি system catalog. চেক করার জন্য উপলব্ধ অন্য কিছু অ্যাক্সেস পদ্ধতি system catalog.

এছাড়াও, SELECT * ব্যবহার করার প্রয়োজন নেই, কেবল NULL value দ্বারা এটি পরীক্ষা করে দেখুন

IF EXISTS(
           SELECT NULL 
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE
             TABLE_NAME = 'myTableName'
             AND COLUMN_NAME = 'myColumnName'
         ) 

একটি ভাল বন্ধু এবং সহকর্মী আমাকে দেখিয়েছে কিভাবে আপনি একটি কলাম পরীক্ষা করতে SQL সার্ভার 2005+ এ SQL ফাংশন OBJECT_ID এবং COLUMNPROPERTY এর সাথে IF ব্লক ব্যবহার করতে পারেন। আপনি নীচের অনুরূপ কিছু ব্যবহার করতে পারেন:

আপনি এখানে নিজের জন্য দেখতে পারেন

IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL AND
    COLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)
BEGIN
    SELECT 'Column does not exist -- You can add TSQL to add the column here'
END

এখনো আরেকটি বৈচিত্র্য ...

SELECT Count(*) AS existFlag FROM sys.columns 
WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')

এটা চেষ্টা কর

SELECT COLUMNS.*
FROM   INFORMATION_SCHEMA.COLUMNS COLUMNS,
       INFORMATION_SCHEMA.TABLES TABLES
WHERE  COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
       AND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name') 

এটা চেষ্টা কর...

IF NOT EXISTS(
  SELECT TOP 1 1
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE 
    [TABLE_NAME] = 'Employees'
    AND [COLUMN_NAME] = 'EmployeeID')
BEGIN
  ALTER TABLE [Employees]
    ADD [EmployeeID] INT NULL
END

এটি এসকিউএল 2000 এ আমার জন্য কাজ করেছে:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END

এসকিউএল সার্ভার 2005 এর পরে:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'columnName'
          AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
    -- Column Exists
END

মার্টিন স্মিথ এর সংস্করণ সংক্ষিপ্ত:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END

কলাম অস্তিত্ব পরীক্ষা করে যারা এটি ড্রপ।

SQL সার্ভার 2016 এ আপনি বড় IF wrappers পরিবর্তে নতুন DIE বিবৃতি ব্যবহার করতে পারেন

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

গমের উত্তর ভাল, তবে অনুমান করে যে আপনার কোনও স্কিম বা ডাটাবেসের মধ্যে কোনও একক টেবিল নাম / কলামের নাম জোড়া নেই। এটির জন্য এটি নিরাপদ করতে এটি ব্যবহার করুন ...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'

ডাটাবেসটিতে কলাম যোগ করার জন্য আমি এখানে ব্যবহার করা একটি সহজ স্ক্রিপ্ট:

IF NOT EXISTS (
        SELECT *
        FROM sys.Columns
        WHERE Name = N'QbId'
            AND Object_Id = Object_Id(N'Driver')
        )
BEGIN
    ALTER TABLE Driver ADD QbId NVARCHAR(20) NULL
END
ELSE
BEGIN
    PRINT 'QbId is already added on Driver'
END

এই উদাহরণে, Name যোগ করার জন্য ColumnName Name এবং Object_Id হল TableName


প্রথমে পরীক্ষা করুন যে table / column ( id / name ) সংমিশ্রণ dbo.syscolumns (ক্ষেত্রের সংজ্ঞাগুলি সমন্বিত একটি অভ্যন্তরীণ SQL সার্ভার টেবিল) বিদ্যমান থাকে এবং যদি এটি যোগ করার জন্য উপযুক্ত ALTER TABLE ক্যোয়ারী না দেয়। উদাহরণ স্বরূপ:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL

ভালো কিছু চেষ্টা করুন:

CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))
RETURNS varchar(1) AS
BEGIN
DECLARE @Result varchar(1);
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
BEGIN
    SET @Result = 'T'
END
ELSE
BEGIN
    SET @Result = 'F'
END
RETURN @Result;
END
GO

GRANT EXECUTE ON  [ColumnExists] TO [whoever]
GO

তারপর এটি ভালো ব্যবহার করুন:

IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
  ALTER TABLE xxx
  ADD yyyyy varChar(10) NOT NULL
END
GO

এটি SQL সার্ভার 2000 এবং SQL Server 2005 উভয়ে কাজ করা উচিত। SQL সার্ভার 2008 সম্পর্কে নিশ্চিত না, তবে কেন তা দেখতে না।


সবচেয়ে সহজ এবং বোধগম্য সমাধান এক:

IF COL_LENGTH('Table_Name','Column_Name') IS NULL
 BEGIN
    -- Column Not Exists, implement your logic
 END 
ELSE
 BEGIN
    -- Column Exists, implement your logic
 END

গৃহীত উত্তর একটি টেম্প টেবিল সংস্করণ:

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end

IF NOT EXISTS( SELECT NULL
            FROM INFORMATION_SCHEMA.COLUMNS
           WHERE table_name = 'tablename'
             AND table_schema = 'db_name'
             AND column_name = 'columnname')  THEN

  ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';

END IF;

declare @myColumn   as nvarchar(128)
set @myColumn = 'myColumn'
if not exists (
    select  1
    from    information_schema.columns columns 
    where   columns.table_catalog   = 'myDatabase'
        and columns.table_schema    = 'mySchema' 
        and columns.table_name      = 'myTable' 
        and columns.column_name     = @myColumn
    )
begin
    exec('alter table myDatabase.mySchema.myTable add'
    +'    ['[email protected]myColumn+'] bigint       null')
end

if exists (select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='<table_name>' and COLUMN_NAME='<column_name>')
  begin
    print 'Column you have specified exists'
  end
else
  begin
    print 'Column does not exists'
  end

select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'




sql-server-2016