محتویات سایت
        برچسب های محبوب 








 
   تکنیکی برای تولید کدهای UPDATE
  ویوهای سیستمی در دادن اطلاعات مرتبط با جداول و ستونهای بانک نقش بسیار مهمی ایفا می کنند در این مقاله به معرفی یک از این ویو ها پرداخته شده است.
   SQL Server
   ۱۵۹۲۸
   این مقاله حاوی فایل ضمیمه نمی باشد
   محمد سلیم آبادی
   ۱۳۸۸/۱۲/۱۹
نسخه قابل چاپ نسخه قابل چاپ

فرض کنید تعدادی جدول ایجاد کرده اید که در آنها ستونهایی وجود دارند که Nullable هستند (به اصطلاح مقادیر NULL را می پذیرند) حالا بعد از مدتی که تعدادی سطر در آن جداول درج کرده ایم برای این جداول مقدار پیش فرض تعریف کرده ایم. دنبال دستوری می گردیم که مقادیر NULL که قبلا در جداول تعریف شده اند به مقادیر پیش فرض مربوطه ویرایش شوند.

اولین ایده این است که برای هر جدول دستور UPDATE مستقلی بنویسیم و آن را اجرا کنیم. ایده ی بهتر این است که یک گزارش از تمام ستون های بانک بگیریم که دارای مقدار پیش فرض هستند. سپس در عبارت SELECT دستور UPDATE را طراحی کنیم. به این مثال توجه کنید:

کد زیر ستون 1 جدول 1 را در صورتی که برابر با مقدار NULL باشد به مقدار پیش فرض ویرایش می کند:
 

UPDATE t1
   SET column_1 = DEFAULT
  FROM table_1 AS t1
 WHERE t1.column_1 IS NULL;

حالا اگر بخواهیم برای مثلا 20 جدول این دستور را بنویسیم کار خسته کننده ای خواهد بود. ولی راه بهتری نیز وجود دارد.

ویوی سیستمی INFORMATION_SCHEMA.COLUMNS برای هر ستونی در بانک جاری سطری را برمی گرداند. این ستون می تواند مرتبط با یک جدول باشد یا یک ویو یا چیز دیگری. برخی از attribute های این ویو از قرار زیر هستند:
TABLE_NAME : نام جدول
COLUMN_NAME: نام ستون
COLUMN_DEFAULT: مقدار پیشفرض ستون
IS_NULLABLE: وضعیت Nullability ستون
DATA_TYPE: نوع ستون و ...

متاسفانه ویژگی/ستونی مرتبط با نوع جدول (TABLE_TYPE) وجود ندارد که مشخص کند این ستون مرتبط با جدول است یا ویو (View) یا هر چیز دیگری. در اینگونه موارد می توانیم از تابع OBJECTPROPERTY استفاده کنیم. این تابع نیاز به دو آرگومان ورود دارد. اولی کد شی و دومی خصیصه. کد شی را می توانیم از تابع OBJECT_ID بدست آوریم. در این مثال ما نیاز داریم ستون هایی که مرتبط به جدول نیستند فیلتر کنیم. پس آرگومان دوم تابع خصیصه ی ISTABLE خواهد بود. این تابع اگر مقدار 1 را با خصیصه ی ISTABLE برگرداند به این معناست که شی مورد نظر جدول است در غیر اینصورت جدول نیست.

با این توضیحات Query مورد نظر ما تا به اینجا به این شکل در خواهد آمد:
 

USE Northwind;
GO

SELECT table_name, column_name, column_default
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE column_default IS NOT NULL
   AND OBJECTPROPERTY(OBJECT_ID(table_name), 'istable') = 1;

با اجرای Query فوق سطرهای زیر بدست آمده اند:

در مرحله ی بعدی قست Target کوئری فوق را طوری دستکاری می کنیم که پس از اجرای Query کد ویرایش مورد نظر ایجاد شود. دقت داشته باشید که قبل اجرای Query نتیجه یا Result را روی Text تنظیم کنید. پس از اجرای Query نتیجه ی تولید شده در پنجره Results را کپی کرده و در پنجره ی مربوط به اجرای کدها Paste کرده و در نهایت کدها را اجرا کنید.

در مثال کد به این شکل در خواهد آمد:
(نکته: برخی از برنامه نویسان ممکن است از استاندارد های نام گذاری ستون ها و جداول بانک اطلاعاتی پیروی نکنند و نام یک جدول از دو کلمه ی مستقل تشکیل شده باشد در این صورت نیاز داریم نام جداول داخل یک جفت براکت [] قرار گیرد)

 

USE Northwind;
GO

SELECT 'UPDATE ' + '[' + table_name + ']' +
         ' SET ' + '[' + column_name + ']' + ' = ' + column_default +
       ' WHERE ' + '[' + column_name + '] IS NULL' + ';'
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE column_default IS NOT NULL
   AND OBJECTPROPERTY(OBJECT_ID(table_name),'istable') = 1;


/*
---------------------------------------------------------------------
UPDATE [Orders] SET [Freight] = (0) WHERE [Freight] IS NULL;
UPDATE [Products] SET [UnitPrice] = (0) WHERE [UnitPrice] IS NULL;
UPDATE [Products] SET [UnitsInStock] = (0) WHERE [UnitsInStock] IS NULL;
UPDATE [Products] SET [UnitsOnOrder] = (0) WHERE [UnitsOnOrder] IS NULL;
UPDATE [Products] SET [ReorderLevel] = (0) WHERE [ReorderLevel] IS NULL;
UPDATE [Products] SET [Discontinued] = (0) WHERE [Discontinued] IS NULL;
UPDATE [Order Details] SET [UnitPrice] = (0) WHERE [UnitPrice] IS NULL;
UPDATE [Order Details] SET [Quantity] = (1) WHERE [Quantity] IS NULL;
UPDATE [Order Details] SET [Discount] = (0) WHERE [Discount] IS NULL;

(9 row(s) affected)
*/