نتایج حاصل از یک دستور dbcc رو چطور میتونیم به یک فایل بفرستیم .(غیر از راه حل OSQL)
نتایج حاصل از یک دستور dbcc رو چطور میتونیم به یک فایل بفرستیم .(غیر از راه حل OSQL)
معمای جالبی بود! (بابک جان به نظرم هنوز با SHOWCONTIG داری سر و کله میزنی! من برای مثال از همین استفاده کردم)
USE Northwind
GO
CREATE PROC Gen_TabResult
AS
DBCC SHOWCONTIG ('Orders','PK_Orders') WITH TABLERESULTS
SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
GO
EXEC Master..XP_CmdShell 'BCP "EXEC Northwind..Gen_TabResult" QUERYOUT C:\MyResult.txt -T -c -Craw'
اگر برای DBCCهای دیگه خواستی استفاده کنی، تعداد NULLها رو دقت کن.
موفق باشی
ممنون امین جان
بله هنوز درگیر اون مسئله هستم
اینم یک سری کد
البته بک باگ خیلی ریز داره که فکر کنم به sql Server مربوطه بشه
با کمک این کد میشه DataBase Consistency Check دستور Showcontig رو با کمک OSQL به خروجی داد اما همیشه یک جدول ( اونم آخرین جدول رو نمایش نمیده )
/*
**Script that Executes DBCC ChekDB in all the databases
**and records the result in a log file named C:\CheckDB\Current_Date\Db_Current Date.log
**It is necesary to create a directory in c:\ with the name "Checkdb".
**The Script connects to the server with OSQL and it needs the password of the SA.
**In this script is null, but change it with your own.
*/
Set Nocount on
Declare @dbname varchar(100)
Declare db Cursor For --Cursor that holds the names of the databases without Pubs and Northwind
Select name from master.dbo.sysdatabases
Where name not in ('Pubs','Northwind','master','model','msdb','tempd b')
Declare @date Varchar(20) --Date to name the .log file
Set @date=(Select Convert(Varchar(50),getdate(),110))
Declare @osql varchar(1000)
/*
**Then I create a Subdirectory in c:\Checkdb\ with the date as name.
**Because it use the current date as parameter to create the Subdirectory,
**if you execute the script more that once in the same day, it will show you
**and error because the subdirectory already exist.
*/
Declare @mkdir varchar(100)
Set @mkdir='EXEC master.dbo.xp_cmdshell '+''''+'mkdir c:\CheckDb\'+@date+''''
EXEC (@mkdir)
/*
**I use the cursor to execute the osql statement in all the databases
**wich log every DBCC Checkdb in the path created before.
**If the password of the SA is not null, change it here.
*/
Open db
Fetch Next from db into @dbname
While @@Fetch_status=0
Begin
--Set @osql='EXEC master.dbo.xp_cmdshell '+''''+'osql -Ubk -Pakz -Q"DBCC Checkdb ("'+@dbname+'")" -oC:\CheckDB\'+@date+'\'+@dbname+'_'+@date+'.log'+' '''
Set @osql='EXEC master.dbo.xp_cmdshell '+''''+'osql -Ubabak -Pbabakz -Q"DBCC Showcontig " -oC:\CheckDB\'+@date+'\'+@dbname+'_'+@date+'.log'+' '''
EXEC (@osql) --Execute the osql statement
Fetch Next from db into @dbname
End
Close db
/*
**This section is in coments because it enable you to send the log files by E-mail.
**If you want to recieve all the log files by email uncoment this section to enable the script.
**You must have configured a mail client in your server
Declare @mail Varchar(1000)
Open db
Fetch Next from db into @dbname
While @@Fetch_status=0
Begin
Set @mail='EXEC master.dbo.xp_sendmail @recipients='+''''+'your@adress.com'+''''+',
@subject='+''''+'Log of execution of CheckDB in Database '+@dbname+''''+',
@message='+''''+'Check the log to see if an error ocurred while executing CheckDB in database '+@dbname+''''+',
@attachments='+''''+'C:\CheckDB\'+@date+'\'+@dbnam e+'_'+@date+'.log'+''''
Fetch Next from db into @dbname
EXEC (@mail)
End
--Close and Deallocate the Cursor
Close db
**Uncoment up to here to use
*/
Deallocate db
آخرین ویرایش به وسیله بابک زواری : پنج شنبه 10 آذر 1384 در 14:22 عصر
فکر میکنم دلیل ندادن خروجی به بعضی از دیتابیس ها بخاطر استفاده از فاصله در نام دیتابیس باشه
Set @osql='EXEC master.dbo.xp_cmdshell '+''''+'osql -Usa -P -Q"DBCC Showcontig " -o"C:\CheckDB\'+@date+'\'+@dbname+'_'+@date+'.log"' +''''
در این کد شما چی ؟ اینجا درسته ؟
Set @osql='EXEC master.dbo.xp_cmdshell '+''''+'osql -Usa -P -Q"DBCC Showcontig " -o"C:\CheckDB\'+@date+'\'+@dbname+'_'+@date+'.log"' +''''
بله, این تنها خطی بود که من عوض کردم.
قبول نیست! قائده بازی رو رعایت نکردین ;)
قرار بود از OSQL استفاده نکنیم!!
بابک جان ضمنا یک روش دیگه به ذهنم رسید که بسیار مرتب کار میکنه:
هر Step از Job میتونه یک Output File داشته باشه. شما در Step میتونی DBCC رو استفاده کنی و بهش مسیر دلخواه رو برای Result بدی. حالا هر وقت نیاز داشتی، SP_Start_Job رو Call کن تا برات اجرا کنه و نتیجه رو به File بفرسته.
من این کار رو انجام دادم و بعد از طریق Enterprise Manager ازش Generate SQL Script گرفتم. حالا این Script رو میتونی در برنامه (مثلا به شکل SP) استفاده کنی. اگر چه به راحتی استفاده از BCP نیست، اما خروجی اون بسیار مرتب و مناسبه.
امین جان, روشی که شما استفاده کردید خیلی جالب بود و ترکیب اون با کد آقا بابک فکر کنم یک روش جالب برای نگهداری این اطلاعات بشه.