PDA

View Full Version : مقاله اي درباره ي دو SP سند نشده در SQL Server



yasercomeng
چهارشنبه 19 تیر 1387, 02:08 صبح
سلام يه مقاله از سايت TechRepublic در باره ي دو SP كه در سندهاي SqlServer قرار داده نشدند رو ترجمه كردم.اميدوارم استفاده كنيد.اين مقاله براي يه هفته پيش پس خوب ازش استفاده كنيد.

اين مقاله در ارتباط با دو StoredProcedure با نام هاي SP_msforeachdb و SP_msforeachtable مي باشد.
من (نويسنده مطلب) به ندرت از پيمايش به هنگام برنامه نويسي پايگاه داده استفاده ميكنم.چون ساختار حلقه در دنياي پايگاه داده به سمت مديريت سخت تر و كندتر بودن ساختارهاي Set-Based ميل دارد.به هر حال اوقاتي هم وجود دارد كه استفاده از پيمايش در پايگاه داده مفيد مي باشد.من مثالهايي رو با استفاده از دو SP نامستند كه به وسيله Microsoft فراهم شده است را در اين مقاله به شما نشان خواهم داد.(توجه:مثالهاي اين مقاله در SQL Server 2000 و SQL Server 2005 كار مي كند.)
SP_msforeachdb‌ و SP_msforeachtable به شما اجازه پاس دادن دستورات TSQL را مي دهد كه اين دستورات (TSQL) در يك مدل حلقه اي FOR…EACH براي هر پايگاه داده يا براي هر جدول در يك پايگاه داده اجرا مي شود.زماني كه شما مجموعه اي از اعمال مانند گرفتن پشتيبان از تمام پايگاه داده هاي كاربران يا بدست آوردن اندازه هر جدول را انجام مي دهيد اين رويه ها بسيار كارآمد هستند .
SP_msforeachdb
اين رويه يك رشته از نوع TSQL دريافت مي كند و براي اجرا شدن در هر پايگاه داده اي كه در SQL Server شما وجود دارد استفاده مي شود.اين رويه بويژه وقتي كه شما در حال انجام كارهاي مربوط به مديريت پايگاه داده و اعمال نگهداري پايگاه مانند انجام عمل پشتيبان گيري هستيد مفيد مي باشد.اين مثال در كل پايگاه داده هاي موجود در سرور حركت كرده و نام تمام پايگاه داده ها را نمايش مي دهد.

EXECUTE sp_msforeachdb ‘use ? PRINT DB_NAME()’
اگه شما اين كد را در تجربيات خود نديده باشيد ممكن است كمي گيج كننده به نظر آيد.به طرز استفاده از علامت (؟) دقت كنيد؛ اين كاراكتر نام پايگاه هايي كه در طول پيمايش از رويه بازگردانده مي شود را نشان مي دهد.علامت (؟) در هر جايي از script كه بخواهم از نام پايگاه استفاده كنم بكار خواهد رفت.با كمي تغيير در كد بالا مي توان از آن براي گرفتن پشتيبان از همه ي پايگاه هاي كاربران موجود در سرور استفاده كرد.به عنوان مثال:

EXECUTE sp_msforeachdb ' USE ? IF DB_NAME() NOT IN(''master'',''msdb'',''tempdb'',''model'')
BACKUP DATABASE ? TO DISK = ''G:?.bak, WITH INIT'' '

به طريقه استفاده از علامت هاي (“) دقت كنيد؛ اين علامت ها مكررا در توليد كد TSQL و نمايش كتيشن(‘) استفاده مي شوند.علامت كتيشن براي نشان دادن شروع و پايان دستور به كار گرفته شده است.
SP_msforeachtable
رويه sp_msforeachtable‌ بسيار شبيه رويه قبلي مي باشد با اين تفاوت كه اين رويه در طول جدول هاي پايگاه داده مورد استفاده پيمايش مي كند.اين رويه براي انجام اعمالي نظير جمع آوري آمار و انجام اعمالي روي حجم زيادي از اطلاعات جداول مناسب مي باشد.در مثال زير من از رويه sp_msforeachtable براي فراخواني يك StoredProcedure با نام sp_spaceused استفاده كردم و به آن SP نام جدول مورد نظر را پاس داده ام.

CREATE TABLE #TableSizes
{
TableName NVARCHAR(255),
TableRows INT,
ResevedSpaceKB VARCHAR(20),
DataSpaceKB VARCHAR(20),
IndexSizeKB VARCHAR(20),
UnusedSpaceKB VARCHAR(20)
}
INSERT INTO #TableSizes
EXEC sp_msforeachtable ‘sp_spaceused “?” ’
SELECT * FROM #TableSizes
ORDER BY TableRows DESC

يكي از مفيدترين جنبه هاي اين كد ورود نتايج از sp_spaceused به داخل جدول مي باشد.متذكر مي شوم كه من خود رويه sp_spaceused را فراخواني نكردم؛ بلكه به صورت پويا آنرا داخل حلقه فراخواني كردم.علاوه بر اين مدل اجراي كد من قادر خواهم بود تا نتايج را بدست آورده و براي استفاده هاي بعدي در جدول ذخيره كنم.
منبع: http://blogs.techrepublic.com.com/datacenter/?p=395


همه چيز اگه تيره تر مي نمايد روشن مي شود زود
تنها اين حقيقتي است
باراني بايد تا رنگين كماني برآيد.:چشمک: