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




sql-server-2008 tsql sql-server-2012 sql-server-2016 (20)

आप रुचि रखने वाली सारणी के बारे में बहुत कुछ जानने के लिए जानकारी स्कीमा सिस्टम दृश्यों का उपयोग कर सकते हैं:

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

आप info_schema विचारों का उपयोग करके डेटाबेस, दृश्य प्रक्रियाओं और डेटाबेस के बारे में बहुत कुछ पूछताछ भी कर सकते हैं।

यदि यह अस्तित्व में नहीं है तो मुझे एक विशिष्ट कॉलम जोड़ना होगा। मेरे पास ऐसा कुछ है, लेकिन यह हमेशा झूठा देता है:

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

SQL सर्वर डेटाबेस की तालिका में कोई कॉलम मौजूद है या नहीं, मैं कैसे जांच सकता हूं?


कॉलम के अस्तित्व की जांच करने के कई तरीके हैं। मैं दृढ़ता से INFORMATION_SCHEMA.COLUMNS का उपयोग करने की अनुशंसा करता हूं क्योंकि यह उपयोगकर्ता के साथ संवाद करने के लिए बनाया गया है। निम्नलिखित सारणी पर विचार करें:

 sys.objects
 sys.columns

और यहां तक ​​कि कुछ अन्य एक्सेस विधियां सिस्टम कैटलॉग की जांच के लिए उपलब्ध हैं।

इसके अलावा, SELECT * का उपयोग करने की कोई आवश्यकता नहीं है, बस इसे शून्य मान द्वारा जांचें

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

मुझे एसक्यूएल सर्वर 2000 के लिए समान की आवश्यकता थी और, जैसा कि @ मिच बताता है, यह केवल 2005+ में काम करता है।

क्या इसे किसी और की मदद करनी चाहिए, यह अंत में मेरे लिए काम करता है:

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

एसक्यूएल सर्वर 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

सबसे पहले जांचें कि 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

सबसे सरल और समझने योग्य समाधान में से एक है:

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 * 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

यहां एक साधारण स्क्रिप्ट है जिसका उपयोग मैं डेटाबेस में कॉलम के अतिरिक्त प्रबंधन के लिए करता हूं:

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 Object_Id जोड़ा जाना है और Object_Id Name है


यह SQL 2000 में मेरे लिए काम किया:

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

कुछ ऐसा करने का प्रयास करें:

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 Server 2000 और SQL Server 2005 दोनों पर काम करना चाहिए। SQL Server 2008 के बारे में निश्चित नहीं है, लेकिन यह नहीं देखते कि क्यों नहीं।


इसे इस्तेमाल करे

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

मैं सिस्टम तालिका पर INFORMATION_SCHEMA.COLUMNS पसंद करूंगा क्योंकि माइक्रोसॉफ्ट संस्करणों के बीच सिस्टम तालिकाओं को संरक्षित करने की गारंटी नहीं देता है। उदाहरण के लिए, dbo.syscolumns अभी भी SQL 2008 में काम करता है, लेकिन इसे बहिष्कृत किया गया है और भविष्य में किसी भी समय हटाया जा सकता है।


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]+'] bigint       null')
end

फिर भी एक और बदलाव ...

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

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

स्वीकृत उत्तर का एक temp तालिका संस्करण:

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

एक संक्षिप्त संस्करण

 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('AdventureWorks2012.HumanResources.Department','ModifiedDate')

मेटाडेटा दृश्यों का उपयोग करने के मुकाबले इस उत्तर के साथ एक अंतर यह है कि मेटाडेटा फ़ंक्शंस जैसे कि COL_LENGTH हमेशा अलगाव स्तर के बावजूद प्रतिबद्ध परिवर्तनों के बारे में डेटा लौटाता है।


मेरे एक अच्छे दोस्त और सहयोगी ने मुझे दिखाया कि आप कॉलम की जांच के लिए एसक्यूएल सर्वर COLUMNPROPERTY में एसक्यूएल COLUMNPROPERTY और 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

उन लोगों के लिए जो इसे छोड़ने के लिए कॉलम अस्तित्व की जांच कर रहे हैं।

SQL सर्वर 2016 में आप बड़े IF wrappers के बजाय नए DIE कथन का उपयोग कर सकते हैं

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

मूल प्रश्न ने सभी विदेशी कुंजीों की एक सूची को अत्यधिक संदर्भित तालिका में प्राप्त करने के लिए कहा ताकि तालिका को हटाया जा सके।

यह छोटी क्वेरी सभी विदेशी कुंजी को किसी विशेष तालिका में छोड़ने के लिए आवश्यक सभी 'ड्रॉप विदेशी कुंजी' कमांड लौटाती है:

SELECT 
   'ALTER TABLE ['+sch.name+'].['+referencingTable.Name+'] DROP CONSTRAINT ['+foreignKey.name+']' '[DropCommand]'
FROM sys.foreign_key_columns fk
    JOIN sys.tables referencingTable ON fk.parent_object_id = referencingTable.object_id
    JOIN sys.schemas sch ON referencingTable.schema_id = sch.schema_id
    JOIN sys.objects foreignKey ON foreignKey.object_id = fk.constraint_object_id
    JOIN sys.tables referencedTable ON fk.referenced_object_id = referencedTable.object_id
WHERE referencedTable.name = 'MyTableName'

उदाहरण आउटपुट:

[DropCommand]
ALTER TABLE [dbo].[OtherTable1] DROP CONSTRAINT [FK_OtherTable1_MyTable]
ALTER TABLE [dbo].[OtherTable2] DROP CONSTRAINT [FK_OtherTable2_MyTable]

वर्तमान डेटाबेस में सभी विदेशी कुंजी के लिए ड्रॉप कमांड प्राप्त करने के लिए WHERE-Clause को छोड़ दें।





sql-server sql-server-2008 tsql sql-server-2012 sql-server-2016