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




sql-server sql-server-2008 (16)

अपनी विशिष्ट आवश्यकताओं के अनुरूप नीचे ट्विक करें:

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 से पूछताछ कर रहे हैं क्योंकि उदाहरण के लिए आपकी डालने पर लागू किया जा रहा है? क्या आपके पास किसी भी कथन में आपकी तालिका / कॉलम नाम में एक टाइपो है?

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

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

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


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

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

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


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

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

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

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

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

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

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 *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'

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

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

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

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


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

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 है


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

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

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;

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