یکی دیگر از
معایب کوئریهای select * در SQL server این است که تغییرات حاصل در فیلدهای جداول یک بانک اطلاعاتی را در view های ساخته شده از این نوع کوئریها منعکس نمیکند.
برای مثال جدول tblTreeItems را با سه فیلد id ، parent و title در نظر بگیرید. فرض کنید بر این اساس view زیر را ساختهایم:
CREATE VIEW GetData
as
SELECT * FROM tblTreeItems
اکنون به جدول فوق ، فیلد جدید isActive را اضافه میکنیم. پس از این عملیات اگر کوئری ساده SELECT * FROM GetData را اجرا کنیم، فیلد جدید isActive را در آن نخواهیم دید (برخلاف انتظار که میبایست کوئری select * رکوردهای تمام فیلدهای جدول را بر میگرداند. در اینجا ممکن است مدتی وقت صرف دیباگ کردن سیستم شود که چرا تغییرات جدید اعمال نشده و چرا سیستمی که تا چند لحظه پیش داشت کار میکرد الان از کار افتاد!).
باید در نظر داشت که هنگام ایجاد یک view ، تصویری از تمامی فیلدهای مورد استفاده در آن زمان، جهت بالابردن کارآیی کوئری و عدم محاسبه مجدد فیلدها در جداول سیستمی ذخیره میگردد ( * با نام فیلدهای همان زمان ایجاد (نه زمان فعلی)، جایگزین خواهد شد).
این تصویر ایستا است و با تغییر فیلدهای یک جدول به روز نخواهد شد.
برای به روز کردن view ها و stored procedures پس از تغییرات ساختاری در جداول، باید مجددا آنها را کامپایل کرد. برای این منظور راههای زیادی وجود دارد، برای مثال drop کردن یک view و ایجاد مجدد آن. یا باز کردن آن view در management studio (حالت alter query) و سپس فشردن دکمه F5 جهت اجرای مجدد کوئری که اینبار بر اساس اطلاعات جدید به روز خواهد شد. یا استفاده از رویههای سیستمی sp_refreshview و sp_recompile که برای کامپایل مجدد view ها و رویههای ذخیره شده بکار میروند.
برای مدیریت سادهتر این موارد ، اسکریپت زیر تمامی view ها و رویههای ذخیره شده یک دیتابیس را به صورت خودکار یافته و آنها را مجددا کامپایل میکند: (جهت مشاهده آن نیاز به ثبت نام دارد و رایگان است)
Refreshing Views and Recompiling Stored Procs