گاهی ما در برنامه ای با حجم دیتابیس بالا می خواهیم بدانیم آیا ستونی در جدولی وجود دارد یا نه؟
در حالت معمول اولین فکری که به ذهن یک برنامه نویس ممکن است برسد شاید این باشد که یک stored procedure بنویسد و در آن تک تک جداول را بررسی کند . این روش ممکن است در دیتابیس های کوجک مفید باشد اما وقتی تعداد جداول و ستونهای دیتابیس زیاد شود این راه حل جوابگو نیست . اما بکمک راه حلی که امروز برای شما معرفی می کنیم فقط بکمک یک تابع ساده می توانید این کار را انجام دهید .
CREATE FUNCTION Axfn_ColumnExists (
@TableName VARCHAR(100)
,@ColumnName VARCHAR(100)
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @Result VARCHAR(100);
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.Columns
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME = @ColumnName
)
BEGIN
SET @Result = ‘Already Exsits’
END
ELSE
BEGIN
SET @Result = ‘Not Available, You can create now!’
END
RETURN (@Result)
END
GO
SELECT dbo.Axfn_ColumnExists(‘TestTable’, ‘ColumnName’)
همانطور که مشاهده کردید ما تابعی با ۲ پارامتر تعریف کردیم که پارامتر اول نام جدول و پارامتر دوم نام ستون مورد جستجو است و نتیجه تابع را هم بصورت رشته ای تعریف کردیم که اگر ستون وجود داشت پیام مربوطه را بدهد . دقت کنید ما برای یافتن ستون مورد نظر در قسمت INFORMATION_SCHEMA دنبال ستون گشتیم.
حال سوالی که در اینجا پیش میاد این است که INFORMATION_SCHEMA چیست ؟
در SQL SERVER 2005 و ورژن های جدیدتر یک بانک اطلاعاتی دیگر در کنار بانک اطلاعاتی ایجاد شده توسط خودمان وجود دارد و برای دسترسی به پایگاه داده metadata می باشد که حاوی اطلاعاتی از قبیل نام دیتابیس ، جداول آن ، نوع داده های ستون ، حق دسترسی و غیره است . در این بانک اطلاعاتی اطلاعات دیگر بانک های اطلاعاتی موجود در سرور نیز نگهداری می شود و بصورت مجازی و فقط برای دریافت اطلاعات کلیه بانک های موجود در سرور ایجاد شده است و فقط اطلاعات آن از نوع خواندنی است نه نوشتنی .
دستور SELECT 1 هم به این معناست که فقط یک ستون را جستجو می کند . ما هم می توانیم از نام ستون استفاده کنیم و هم از شماره به عنوان تعداد ستون .
