2013-04-24 117 views
0

我編寫了一個SQL腳本來將名稱映射到報告名稱。我已在我的本地SQL Server 2012計算機中進行驗證。它運作良好。然而,當我在服務器上運行,我得到了錯誤爲什麼SQL腳本可以在本地環境中運行,但無法在其他服務器上運行

消息537,級別16,狀態3,行40
傳遞給左或子字符串函數無效長度參數。

我也嘗試直接在遠程服務器上運行「select」部分,結果也是正確的。 我不明白爲什麼它是錯誤的。有什麼想法? (注:我補充「錯誤的位置 - >」中的錯誤行)

DECLARE @jobTable TABLE 
(
    job_name nvarchar(max), 
    report_name nvarchar(max), 
    event_type nvarchar(max), 
    description nvarchar(max), 
    last_run_date int, 
    last_run_time int 
) 

declare 
    @job_name uniqueidentifier, 
    @report_name nvarchar(max), 
    @event_type nvarchar(max), 
    @description nvarchar(max), 
    @last_run_date int, 
    @last_run_time int, 
    @last_run_dur int 



/************** alert ********/ 
declare getId_alertjob_cursor cursor for (
    SELECT 
     [jobs].[name] job_name, 
     alertFeed.relativePath report_name, 
     CONVERT(nvarchar(max), SUBSTRING([steps].[command], CHARINDEX(' @EventType=''', [steps].[command], 0) + LEN(' @EventType='''), CHARINDEX('''', [steps].[command], CHARINDEX(' @EventType=''', [steps].[command]) + LEN(' @EventType=''')) - CHARINDEX(' @EventType=''', [steps].[command], 0) - LEN(' @EventType=''')), 0) event_type, 
     [steps].[last_run_date] last_date, 
     [steps].[last_run_time] last_time, 
     [steps].[last_run_duration] last_dur 
     FROM [msdb].[dbo].[sysjobs] [jobs] INNER JOIN [msdb].[dbo].[sysjobsteps] [steps] ON [jobs].[job_id] = [steps].[job_id], ReportingService_4c0ed75e1e8c4e50acbf853867f071f3_Alerting.dbo.AlertDefinition [alertDef], ReportingService_4c0ed75e1e8c4e50acbf853867f071f3_Alerting.dbo.Feed [alertFeed] 
     WITH (NOLOCK) 
     WHERE [jobs].[name] <> 'syspolicy_purge_history' 
     and alertDef.scheduleid = CONVERT(nvarchar(max), SUBSTRING([steps].[command], CHARINDEX(' @EventData=''', [steps].[command], 0) + LEN(' @EventData='''), CHARINDEX('''', [steps].[command], CHARINDEX(' @EventData=''', [steps].[command]) + LEN(' @EventData=''')) - CHARINDEX(' @EventData=''', [steps].[command], 0) - LEN(' @EventData=''')), 0) 
     and alertDef.FeedId = alertFeed.FeedId 
); 

open getId_alertjob_cursor 
error here--> fetch next from getId_alertjob_cursor INTO @job_name, @report_name, @event_type, @last_run_date, @last_run_time, @last_run_dur 

while @@FETCH_STATUS = 0 
BEGIN 
--  INSERT INTO @jobTable VALUES (@job_name, @report_name, @event_type,'Alert',0,0); 
-- ,@last_run_date,@last_run_time); 
    fetch next from getId_alertjob_cursor INTO @job_name, @report_name, @event_type, @last_run_date, @last_run_time,@last_run_dur 
END 

close getId_alertjob_cursor 
deallocate getId_alertjob_cursor 
+0

是的,他們都是MS SQL服務器2012 – user1504146 2013-04-24 09:28:06

+0

您是否傳遞相同的一組參數? – Maximus 2013-04-24 09:34:04

回答

1

我懷疑這是因爲有與不包含短語@EventType='這也是造成你的子失敗的作業步驟。

中添加一個快速檢查,以確保它首先存在,這樣的事情:

Case 
     When CHARINDEX(' @EventType=''', [steps].[command]) > 0 Then 
     CONVERT(nvarchar(max), SUBSTRING([steps].[command], CHARINDEX(' @EventType=''', [steps].[command], 0) + LEN(' @EventType='''), CHARINDEX('''', [steps].[command], CHARINDEX(' @EventType=''', [steps].[command]) + LEN(' @EventType=''')) - CHARINDEX(' @EventType=''', [steps].[command], 0) - LEN(' @EventType=''')), 0) 
     Else '' 
     End as [EventType] 

只注意到您在WHERE子句中有這樣的:

and alertDef.scheduleid = CONVERT(nvarchar(max), SUBSTRING([steps].[command], CHARINDEX(' @EventData=''', [steps].[command], 0) + LEN(' @EventData='''), CHARINDEX('''', [steps].[command], CHARINDEX(' @EventData=''', [steps].[command]) + LEN(' @EventData=''')) - CHARINDEX(' @EventData=''', [steps].[command], 0) - LEN(' @EventData=''')), 0) 

你也應該添加一個檢查看看command字段是否包含@EventData

也許如果你試圖解釋你想達到什麼目的,可能會發佈一個更好的查詢年。

+0

hummm ....它沒有任何意義,我,becasue它工作得很好,如果我只是運行 選擇XXXXX(在getId_alertjob_cursor相同的代碼) 在遠程服務器 – user1504146 2013-04-24 09:50:27

+0

我想嘗試映射SQL代理作業名稱爲報表名稱。它是解析代理作業命令的第一步。評論是看起來像 { 'code' [ReportingService_4c0ed75e1e8c4e50acbf853867f071f3_Alerting] .dbo.AddEvent @事件類型= 'FireSchedule',@ EVENTDATA = '32BA4917-EC6A-40EC-86A9-7323CF0DD6DF' 'code' 然後我可以得到eventType和EventData – user1504146 2013-04-24 09:56:12

0

首先,我想提一下,在這種情況下不需要使用遊標。即您的查詢可以簡化爲以下內容:

DECLARE @jobTable TABLE 
(
     job_name SYSNAME 
    , report_name SYSNAME 
    , event_type NVARCHAR(1000) 
    , [description] NVARCHAR(2000) 
    , last_run_date INT 
    , last_run_time INT 
) 

INSERT INTO @jobTable 
(
     job_name 
    , report_name 
    , event_type 
    , last_run_date 
    , last_run_time 
) 
SELECT 
     d.job_name 
    , report_name = alertFeed.relativePath 
    , d.event_type 
    , d.last_date 
    , d.last_time 
FROM (
    SELECT 
      job_name = j.[name] 
     , event_type = CASE WHEN CHARINDEX(' @EventType=''', s.[command]) > 0 
      THEN CONVERT(NVARCHAR(MAX), SUBSTRING(s.[command], CHARINDEX(' @EventType=''', s.[command], 0) + LEN(' @EventType='''), CHARINDEX('''', s.[command], CHARINDEX(' @EventType=''', s.[command]) + LEN(' @EventType=''')) - CHARINDEX(' @EventType=''', s.[command], 0) - LEN(' @EventType=''')), 0) 
      ELSE '' 
      END 
     , last_date = s.[last_run_date] 
     , last_time = s.[last_run_time] 
    FROM [msdb].dbo.sysjobs j WITH (NOLOCK) 
    JOIN [msdb].dbo.sysjobsteps s WITH (NOLOCK) ON j.job_id = s.job_id 
    WHERE j.[name] != 'syspolicy_purge_history' 
) d 
JOIN [ReportingService_4c0ed75e1e8c4e50acbf853867f071f3_Alerting].dbo.AlertDefinition [alertDef] ON alertDef.scheduleid = event_type 
JOIN [ReportingService_4c0ed75e1e8c4e50acbf853867f071f3_Alerting].dbo.Feed [alertFeed] ON alertDef.FeedId = alertFeed.FeedId 

此外,我對數據庫[ReportingService _... Alerting]感到不滿。如果它位於正在執行任務的同一臺服務器上,可能值得拒絕使用該數據庫。

相關問題