أحتاج إلى إضافة عمود معين إذا كان غير موجود. لدي شيء مثل التالي ، لكنه دائمًا ما يُرجع خطأ:
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
جرب شيئًا مثل:
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 ، ولكن لا ترى لماذا لا.
بالنسبة للأشخاص الذين يتحققون من وجود العمود لإسقاطه.
في SQL Server 2016 يمكنك استخدام عبارات DIEجديدة _ بدلاً من الأغلفة IF
الكبيرة
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
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
أوضح لي صديق جيد وزميل لي كيف يمكنك أيضًا استخدام كتلة 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
هذا عملت لي في SQL 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 ، وكما يشيرMitch ، هذا فقط يعمل 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;
نسخة جدول مؤقت من إجابة مقبولة :
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
هناك عدة طرق للتحقق من وجود عمود. أوصي بشدة باستخدام 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'
)
إجابة القمح جيدة ، ولكنها تفترض أنه ليس لديك أي أزواج متماثلة لاسم الجدول/اسم العمود في أي مخطط أو قاعدة بيانات. لجعلها آمنة لهذا الشرط استخدام هذا ...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
في ما يلي نص بسيط يمكنني استخدامه لإدارة إضافة الأعمدة في قاعدة البيانات:
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 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 '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';
table -> table script as -> windows جديدة - لديك برنامج نصي للتصميم. فحص وإيجاد اسم العمود في نوافذ جديدة