Meysam's Experiences

MeyEx ,محلی برای انتشار تجربیات من در زمینه های مرتبط با حوزه ی تولید نرم افزار

Meysam's Experiences

MeyEx ,محلی برای انتشار تجربیات من در زمینه های مرتبط با حوزه ی تولید نرم افزار

Meysam's Experiences

در زمینه ی تولید نرم افزار فعالیت دارم. نوشته های این بلاگ به طور خاص در مورد تمامی زمینه هایی که منتهی به تولید نرم افزار و یا تجربیاتی که در محیط کاریم کسب می کنم خواهند بود. [البته فعلا به دلیل مشغله های جانبی دیگر و داشتن مخاطب در آن حوزه ها, مطالب کمی غیر نرم افزار شده است!]
در این بلاگ سعی شده که مطالب به صورت تخصصی و دسته بندی شده منتشر شوند

تابلوی اعلانات
جدیدترین نظرات

اضافه نمودن فیلد به تمام جداول دیتابیس در SQL Server

يكشنبه, ۱۷ فروردين ۱۳۹۳، ۰۴:۳۹ ب.ظ

در زمان پیاده سازی دیتابیس یک پروژه؛ چیزی که توجهم را به خود جلب کرد این بود که چهار فیلد ( InsertedBy, InsertDateTime, ModifiedBy, ModifyDateTime ) در تمامی جداول (98%) تکرار شده بود, طبیعتا ایجاد 232 فیلد (4 فیلد تکراری در 58 جدول) تکراری کار خسته کننده ای هست.

خب چرا از طریق یک داینامیک کوئری این کار را به صورت اتوماتیک انجام ندهیم؟

به این صورت که با استفاده از یک کرزر (Cursor) لیست جداول دیتابیس  پیمایش می شوند, سپس به ازای هر یک از جداول, با استفاده از دو کوئری ابتدا وجود فیلد مورد نظر بررسی می شود, و در صورت عدم وجود آن؛ کوئری اضافه شدن فیلد اجرا می شود.

به کد زیر دقت کنید:

USE My_DB
GO

DECLARE @TableName VARCHAR(30)
DECLARE @Query VARCHAR(MAX)
DECLARE AlterTable_Cursor CURSOR
FOR
SELECT SCHEMA_NAME(schema_id) + '.' + t.name
FROM sys.tables AS t
OPEN AlterTable_Cursor
FETCH NEXT FROM AlterTable_Cursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN

SET @Query = 'IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''InsertedBy'')
ALTER TABLE ' + @TableName + ' ADD InsertedBy int not NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''InsertDateTime'')
ALTER TABLE ' + @TableName + ' ADD InsertDateTime datetime not NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''ModifiedBy'')
ALTER TABLE ' + @TableName + ' ADD ModifiedBy int NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''ModifyDateTime'')
ALTER TABLE ' + @TableName + ' ADD ModifyDateTime datetime NULL
'
--PRINT @Query
EXEC(@Query)
FETCH NEXT FROM AlterTable_Cursor INTO @TableName
END
CLOSE AlterTable_Cursor
DEALLOCATE AlterTable_Cursor

توجه: می توان در صورت نیاز ابتدا ستون موجود را حذف و مجددا اقدام به ایجاد آن نمود؛

همچنین دقت داشته باشید در صورتی که جداول شما دارای رکورد باشند؛ برای ایجاد ستون هایی که Not Null می باشند؛ پیغام خطا صادر خواهد شد.

با کمی دقت و حوصله می توان این کوئری را با صورت دلخواه درآورد و از انجام مشقت بار کارهای تکراری از این دست جلوگیری نمود.

  • میثم هوشمند

Dynamic Query

Alter Table

SQL Server Query

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی