سؤال

أنا بحاجة إلى إضافة محدد العمود إذا كان غير موجود.لدي شيء مثل التالية ، لكنه يعود دائما كاذبة:

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

كيف يمكنني معرفة ما إذا كان عمود موجود في جدول قاعدة بيانات SQL Server?

هل كانت مفيدة؟

المحلول

SQL Server 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

نصائح أخرى

نسخة أكثر إيجازا

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 دائما العودة فقط بيانات حول ارتكبت التغييرات بغض النظر عن مستوى العزل في التأثير.

قرص أدناه لتتناسب مع متطلبات محددة الخاص بك:

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

أفضل INFORMATION_SCHEMA.COLUMNS عبر نظام الجدول لأن Microsoft لا تضمن الحفاظ على نظام الجداول بين الإصدارات.على سبيل المثال ، dbo.syscolumns لا تزال تعمل في SQL 2008, لكنه مستنكر و يمكن إزالتها في أي وقت في المستقبل.

يمكنك استخدام المعلومات مخطط النظام الآراء لمعرفة أي شيء حول الجداول كنت ترغب في:

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

يمكنك أيضا استجواب طرق العرض والإجراءات المخزنة والى حد كبير أي شيء عن قاعدة البيانات باستخدام طرق عرض Information_schema.

أولا التحقق إذا كان table/column(id/name) مزيج موجود في dbo.syscolumns (داخلي SQL Server الجدول الذي يحتوي على الحقل التعاريف), و إذا لم يصدر المناسبة ALTER TABLE الاستعلام لإضافته.على سبيل المثال:

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

بالنسبة للأشخاص الذين يتم التحقق من وجود عمود إسقاطه.

في SQL Server 2016 يمكنك استخدام جديدة يموت البيانات بدلا من الكبيرة IF مغلفة

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

محاولة شيء من هذا القبيل:

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 ، ولكن لا أرى لماذا لا.

صديق و زميل لي علمني كيف يمكنك أيضا استخدام IF كتلة مع SQL وظائف OBJECT_ID و COLUMNPROPERTY في SQL SERVER 2005+ للتحقق من عمود.يمكنك استخدام شيء مشابه لما يلي:

يمكنك ان ترى لنفسك هنا

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

بالنسبة لي فقد عملت في SQL server 2000:

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

جرب هذا

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

أنا في حاجة مشابهة ل SQL SERVER 2000 ، كما @ميتش يشير هذا يعمل فقط inm 2005+.

ينبغي أن تساعد أي شخص آخر ، وهذا ما عملت بالنسبة لي في النهاية:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
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 exist'
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;
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'

مؤقت نسخة من الجدول الإجابة المقبولة:

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

القمح هو إجابة جيدة ، ولكن يفترض ليس لديك أي متطابقة اسم الجدول / عمود اسم أزواج في أي مخطط أو قاعدة بيانات.لجعلها آمنة لهذا الشرط استخدام هذا...

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

هناك عدة طرق للتحقق من وجود عمود.وأود أن نوصي بشدة لاستخدام INFORMATION_SCHEMA.COLUMNS كما يتم إنشاؤه من أجل التواصل مع المستخدم.النظر في الجداول التالية:

 sys.objects
 sys.columns

وحتى بعض طرق الوصول المتاحة للتحقق system catalog.

أيضا لا تحتاج إلى استخدام SELECT *, ، ببساطة اختبار من قبل NULL value

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

واحدة من أكثر بسيطة ومفهومة الحل هو:

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 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 يمكن ان تضاف ، Object_Id هو TableName

أدناه الاستعلام يمكن استخدامها للتحقق من ما إذا كان البحث عمود موجود أو لا في الجدول.يمكننا اتخاذ القرار بناء على نتيجة البحث كما هو مبين أدناه.

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

بعد اختلاف آخر...

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

الجدول -->النصي الجدول -->ويندوز جديد - لديك برنامج التصميم.تحقق من العثور على اسم العمود في نوافذ جديدة

تنفيذ أدناه الاستعلام للتحقق إذا كان العمود موجود في الجدول:

IF(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName') IS NOT NULL
PRINT 'Column Exists in the given table';
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'columnName'
      AND Object_ID = Object_ID(N'schemaName.tableName'))

هذا ينبغي أن يكون إلى حد ما أسهل طريقة ومباشرة إلى الأمام إلى حل هذه المشكلة.لقد استخدمت هذا عدة مرات على سيناريوهات مماثلة.وهي تعمل مثل السحر, لا شكوك في ذلك.

IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table Name' and COLUMN_NAME = 'Column Name')

BEGIN
--COLUMNS EXISTS IN TABLE
END

ELSE BEGIN
--COLUMNS DOES NOT EXISTS IN TABLE
END
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top