it-swarm.asia

كيفية التحقق من وجود عمود في جدول SQL Server؟

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

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

كيف يمكنني التحقق من وجود عمود في جدول قاعدة بيانات SQL Server؟

1715
Maciej

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
1890
Mitch Wheat

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

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

918
Martin Smith

يعدل أدناه ليناسب متطلباتك المحددة:

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 في نفس قاعدة البيانات التي يتم تطبيق الإدراج الخاص بك عليها على سبيل المثال؟ هل لديك خطأ مطبعي في اسم الجدول/العمود الخاص بك في أي من البيانين؟

131
Luke Bennett

جرب هذا...

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
67
Leon Tayson

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

44
Christian Hayter

يمكنك استخدام طرق عرض نظام مخطط المعلومات لاكتشاف أي شيء عن الجداول التي تهتم بها:

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

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

39
anonymous

تحقق أولاً مما إذا كانت تركيبة 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
30
mdb

جرب شيئًا مثل:

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

28
Matt Lacey

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

في SQL Server 2016 يمكنك استخدام عبارات DIEجديدة _ بدلاً من الأغلفة IF الكبيرة

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
27
Pரதீப்
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
23
Tuomo Kämäräinen

أوضح لي صديق جيد وزميل لي كيف يمكنك أيضًا استخدام كتلة 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
23
brazilianldsjaguar

هذا عملت لي في SQL 2000:

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

جرب هذا

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') 
20
Douglas Tondo

كنت بحاجة مماثلة ل SQL Server 2000 ، وكما يشيرMitch ، هذا فقط يعمل INM 2005+.

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

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
17
FrostbiteXIII
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
14
BYRAKUR SURESH BABU
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;
10
Na30m

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

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
9
crokusek
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'
9
Nishad

هناك عدة طرق للتحقق من وجود عمود. أوصي بشدة باستخدام 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'
         ) 
5
Ali Elmi

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

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

في ما يلي نص بسيط يمكنني استخدامه لإدارة إضافة الأعمدة في قاعدة البيانات:

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

4
UJS

أحد الحلول البسيطة والمفهومة هو:

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
4
Arsman Ahmad

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

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
2
Suraj Kumar

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

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

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

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';
0
S Krishna

table -> table script as -> windows جديدة - لديك برنامج نصي للتصميم. فحص وإيجاد اسم العمود في نوافذ جديدة

0
arnav