2009-10-20 98 views
0

嗨,我使用下面的動態SQL:動態TSQL 2005

declare @cmd nvarchar(4000) 

set @cmd= 

'select ''exec msdb.dbo.sp_update_job @job_id='''''' 
+ convert(nvarchar(255), job_id)+ '''''', 

@owner_login_name=''''sa'''';'' 
from msdb..sysjobs' 


exec sp_executesql @cmd 

,但所有正在被打印成EXEC .......

我想執行的結果不只是打印它。

我該怎麼辦?

問候

Manjot

回答

3

如何:

DECLARE @sql NVARCHAR(MAX); 

SELECT @sql = COALESCE(@sql, '') + ' 
    EXEC msdb.dbo.sp_update_job @job_id = ''' 
    + CONVERT(NVARCHAR(255), job_id) 
    + ''', @owner_login_name = ''sa'';' 
FROM msdb.dbo.sysjobs; 

EXEC sp_sqlexec @sql; 

注意的是sp_sqlexec是無證和不支持。要做到這一點在支持的方式,爲什麼不創建一個遊標,這是很容易跟蹤和調試(沒有紅色的海洋,沒有「看不見」的SQL):

DECLARE @j UNIQUEIDENTIFIER; 

DECLARE c CURSOR FOR 
    SELECT job_id FROM msdb.dbo.sysjobs; 

OPEN c; 

FETCH NEXT FROM c INTO @j; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC msdb.dbo.sp_update_job 
     @job_id = @j, 
     @owner_login_name = 'sa'; 

    FETCH NEXT FROM c INTO @j; 
END 

DEALLOCATE c; 

或者以往更容易,因爲MSDB。 dbo.sysjobs在技術上不是系統表,您可以直接編輯:

UPDATE msdb.dbo.sysjobs 
    SET owner_sid = SUSER_SID('sa'); 
+0

謝謝。 最後一點幫助了我。順便說一句,COALESCE是什麼? – Manjot 2009-10-20 02:02:32

+0

http://msdn.microsoft.com/en-us/library/ms190349.aspx – 2009-10-20 02:12:48

+0

光標可以是一件好事的最佳例子。 – HLGEM 2009-10-20 15:11:46

3

刪除 '選擇'! (同時也刪除一些轉義單引號) 換句話說...

set @cmd= 
    'exec msdb.dbo.sp_update_job @job_id=''' 
    + convert(nvarchar(255), job_id) 
    + ''', @owner_login_name=''sa'';' 

注:不太肯定這最後一件事的配合(可能是在sp_update_job語句結束

-- from msdb..sysjobs' 

。基本上,發生了什麼事情,SELECT語句是被執行的動態SQL是一個select語句,它恰好選擇了一個動態創建的字符串,然後SQL會打印該字符串,就像SELECT語句已被使用一樣,例如:

select 'Once upon a time, a very poor lumberjack..." 

(無論是選擇後的字符串中不影響SQL以任何方式)

現在,作爲與Remus的問題的很好的格式比較明顯,dyanamic SQL語句本身似乎是錯的,但至少SQL將嘗試執行它,現在...

+0

但我需要,所以我需要SELECT語句來得到msdb..sysjobs數據。你會如何編寫我的代碼? – Manjot 2009-10-20 01:45:28

+0

我不認爲Manjot發佈的命令的完整目的是可以理解的。他不是試圖執行單個動態SQL語句,而是試圖在select的結果中爲每一行執行存儲過程。如果你看看你的第一個代碼片段,你能解釋轉換行中提到的job_id來自哪裏嗎? – 2009-10-20 02:00:11

+0

@ Manjot我明白。我在評論爲什麼高管不工作,但看到你的需要,你可能根本不需要任何動態代碼。 (會馬上回來......) – mjv 2009-10-20 02:01:37