sql-server - دوال - كيفية انشاء جدول في sql




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

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 EXISTS(SELECT *
          FROM   INFORMATION_SCHEMA.COLUMNS
          WHERE  TABLE_NAME = 'myTableName'
                 AND COLUMN_NAME = 'myColumnName') 

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


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

يمكنك أن ترى بنفسك هنا

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 Server 2000 و ، كما يشيرMitch ، هذا يعمل فقط inm 2005+.

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

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

أولاً تحقق ما إذا كان تركيبة 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 يمكنك استخدام عبارات DIE جديدة بدلاً من wrappers IF كبيرة

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

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

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

جرب هذا...

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

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

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 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 (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
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


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

 sys.objects
 sys.columns

وحتى بعض طرق الوصول الأخرى المتاحة للتحقق من كتالوج النظام.

أيضا ، لا حاجة لاستخدام SELECT * ، ببساطة اختباره بقيمة NULL

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

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

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

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


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