2009-06-24 11 views
2

これは2つの質問です。 シナリオ:サーバ製品のバージョンを決定し、それに応じてSQLを実行する最も良い方法は?

私はMSDBに問い合わせてジョブスケジュールの詳細を取得するスクリプトを用意しています。明らかに、テーブルはSQL 2000と異なります。したがって、ボックスで実行中のバージョンを確認し、それに応じてクエリを行いたいと思います。今質問:

質問1:

これは私がやっていることです。

IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='8' 
BEGIN 
PRINT 'SQL 2000'--Actual Code Goes Here 
END 
IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='9' 
BEGIN 
PRINT 'SQL 2005'--Actual Code Goes Here 
END 

これを行う良い方法はありますか?

質問2:

上記のスクリプトは、両方の2000年から2005年のボックスに正常に動作が、私は私の実際のコードとの声明「..を印刷」を交換するとき、それは2000年のボックスに微細な動作しますが、実行時に2005のボックスで、2000年のコードブロックを実行しようとし、エラーを返します。ここで

は、実際のコードです:

USE [msdb] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
--Check SQL Server Version 
IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='9' 
BEGIN 
SELECT @@SERVERNAME 
,sysjobs.name 
,dbo.udf_schedule_description(dbo.sysschedules.freq_type, dbo.sysschedules.freq_interval, 
dbo.sysschedules.freq_subday_type, dbo.sysschedules.freq_subday_interval, dbo.sysschedules.freq_relative_interval, 
dbo.sysschedules.freq_recurrence_factor, dbo.sysschedules.active_start_date, dbo.sysschedules.active_end_date, 
dbo.sysschedules.active_start_time, dbo.sysschedules.active_end_time) AS [Schedule Description] 
, CONVERT(CHAR(8), CASE WHEN LEN(msdb.dbo.sysschedules.Active_Start_Time) = 3 
         THEN CAST('00:0' + LEFT(msdb.dbo.sysschedules.Active_Start_Time, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.Active_Start_Time AS VARCHAR(6)), 
              2, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysschedules.Active_Start_Time) = 4 
         THEN CAST('00:' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.Active_Start_Time AS VARCHAR(6)), 
              1, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.Active_Start_Time AS VARCHAR(6)), 
              3, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysschedules.Active_Start_Time) = 5 
         THEN CAST('0' + LEFT(msdb.dbo.sysschedules.Active_Start_Time, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.Active_Start_Time AS VARCHAR(6)), 
              2, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.Active_Start_Time AS VARCHAR(6)), 
              4, 2) AS VARCHAR(8)) 
         WHEN msdb.dbo.sysschedules.Active_Start_Time = 0 
         THEN '00:00:00' 
         ELSE CAST(LEFT(msdb.dbo.sysschedules.Active_Start_Time, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.Active_Start_Time AS VARCHAR(6)), 
              3, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.Active_Start_Time AS VARCHAR(6)), 
              5, 2) AS VARCHAR(8)) 
        END, 108) AS Start_Time, 
     CONVERT(CHAR(8), CASE WHEN LEN(msdb.dbo.sysschedules.active_end_time) = 3 
         THEN CAST('00:0' + LEFT(msdb.dbo.sysschedules.active_end_time, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.active_end_time AS VARCHAR(6)), 
              2, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysschedules.active_end_time) = 4 
         THEN CAST('00:' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.active_end_time AS VARCHAR(6)), 
              1, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.active_end_time AS VARCHAR(6)), 
              3, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysschedules.active_end_time) = 5 
         THEN CAST('0' + LEFT(msdb.dbo.sysschedules.active_end_time, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.active_end_time AS VARCHAR(6)), 
              2, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.active_end_time AS VARCHAR(6)), 
              4, 2) AS VARCHAR(8)) 
         WHEN msdb.dbo.sysschedules.active_end_time = 0 
         THEN '00:00:00' 
         ELSE CAST(LEFT(msdb.dbo.sysschedules.active_end_time, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.active_end_time AS VARCHAR(6)), 
              3, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysschedules.active_end_time AS VARCHAR(6)), 
              5, 2) AS VARCHAR(8)) 
        END, 108) AS End_Time 
,CAST(CASE WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 1 
         THEN CAST('00:00:0' + LEFT(msdb.dbo.sysjobservers.last_run_duration, 1)AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 2 
         THEN CAST('00:00:' + LEFT(msdb.dbo.sysjobservers.last_run_duration, 2)AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 3 
         THEN CAST('00:0' + LEFT(msdb.dbo.sysjobservers.last_run_duration, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              2, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 4 
         THEN CAST('00:' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              1, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              3, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 5 
         THEN CAST('0' + LEFT(msdb.dbo.sysjobservers.last_run_duration, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              2, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              4, 2) AS VARCHAR(8)) 
         WHEN msdb.dbo.sysjobservers.last_run_duration = 0 
         THEN '00:00:00' 
         ELSE CAST(LEFT(msdb.dbo.sysjobservers.last_run_duration, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              3, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              5, 2) AS VARCHAR(8)) 
        END AS VARCHAR(8)) AS LastRunDuration 
FROM msdb.dbo.sysjobs INNER JOIN 
msdb.dbo.syscategories ON msdb.dbo.sysjobs.category_id = msdb.dbo.syscategories.category_id LEFT OUTER JOIN 
msdb.dbo.sysoperators ON msdb.dbo.sysjobs.notify_page_operator_id = msdb.dbo.sysoperators.id LEFT OUTER JOIN 
msdb.dbo.sysjobservers ON msdb.dbo.sysjobs.job_id = msdb.dbo.sysjobservers.job_id LEFT OUTER JOIN 
msdb.dbo.sysjobschedules ON msdb.dbo.sysjobschedules.job_id = msdb.dbo.sysjobs.job_id LEFT OUTER JOIN 
msdb.dbo.sysschedules ON msdb.dbo.sysjobschedules.schedule_id = msdb.dbo.sysschedules.schedule_id 
WHERE sysjobs.enabled = 1 AND msdb.dbo.sysschedules.Active_Start_Time IS NOT NULL 
ORDER BY Start_time,sysjobs.name 
END 

IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='8' 
BEGIN 
SELECT @@SERVERNAME 
,sysjobs.name 
,dbo.udf_schedule_description(sysjobschedules.freq_type, sysjobschedules.freq_interval, 
sysjobschedules.freq_subday_type, sysjobschedules.freq_subday_interval, sysjobschedules.freq_relative_interval, 
sysjobschedules.freq_recurrence_factor, sysjobschedules.active_start_date, sysjobschedules.active_end_date, 
sysjobschedules.active_start_time, sysjobschedules.active_end_time) AS [Schedule Description] 
, CONVERT(CHAR(8), CASE WHEN LEN(msdb.dbo.sysjobschedules.Active_Start_Time) = 3 
         THEN CAST('00:0' + LEFT(msdb.dbo.sysjobschedules.Active_Start_Time, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.Active_Start_Time AS VARCHAR(6)), 
              2, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobschedules.Active_Start_Time) = 4 
         THEN CAST('00:' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.Active_Start_Time AS VARCHAR(6)), 
              1, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.Active_Start_Time AS VARCHAR(6)), 
              3, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobschedules.Active_Start_Time) = 5 
         THEN CAST('0' + LEFT(msdb.dbo.sysjobschedules.Active_Start_Time, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.Active_Start_Time AS VARCHAR(6)), 
              2, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.Active_Start_Time AS VARCHAR(6)), 
              4, 2) AS VARCHAR(8)) 
         WHEN msdb.dbo.sysjobschedules.Active_Start_Time = 0 
         THEN '00:00:00' 
         ELSE CAST(LEFT(msdb.dbo.sysjobschedules.Active_Start_Time, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.Active_Start_Time AS VARCHAR(6)), 
              3, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.Active_Start_Time AS VARCHAR(6)), 
              5, 2) AS VARCHAR(8)) 
        END, 108) AS Start_Time, 
     CONVERT(CHAR(8), CASE WHEN LEN(msdb.dbo.sysjobschedules.active_end_time) = 3 
         THEN CAST('00:0' + LEFT(msdb.dbo.sysjobschedules.active_end_time, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.active_end_time AS VARCHAR(6)), 
              2, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobschedules.active_end_time) = 4 
         THEN CAST('00:' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.active_end_time AS VARCHAR(6)), 
              1, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.active_end_time AS VARCHAR(6)), 
              3, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobschedules.active_end_time) = 5 
         THEN CAST('0' + LEFT(msdb.dbo.sysjobschedules.active_end_time, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.active_end_time AS VARCHAR(6)), 
              2, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.active_end_time AS VARCHAR(6)), 
              4, 2) AS VARCHAR(8)) 
         WHEN msdb.dbo.sysjobschedules.active_end_time = 0 
         THEN '00:00:00' 
         ELSE CAST(LEFT(msdb.dbo.sysjobschedules.active_end_time, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.active_end_time AS VARCHAR(6)), 
              3, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobschedules.active_end_time AS VARCHAR(6)), 
              5, 2) AS VARCHAR(8)) 
        END, 108) AS End_Time 
,CAST(CASE WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 1 
         THEN CAST('00:00:0' + LEFT(msdb.dbo.sysjobservers.last_run_duration, 1)AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 2 
         THEN CAST('00:00:' + LEFT(msdb.dbo.sysjobservers.last_run_duration, 2)AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 3 
         THEN CAST('00:0' + LEFT(msdb.dbo.sysjobservers.last_run_duration, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              2, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 4 
         THEN CAST('00:' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              1, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              3, 2) AS VARCHAR(8)) 
         WHEN LEN(msdb.dbo.sysjobservers.last_run_duration) = 5 
         THEN CAST('0' + LEFT(msdb.dbo.sysjobservers.last_run_duration, 1) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              2, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              4, 2) AS VARCHAR(8)) 
         WHEN msdb.dbo.sysjobservers.last_run_duration = 0 
         THEN '00:00:00' 
         ELSE CAST(LEFT(msdb.dbo.sysjobservers.last_run_duration, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              3, 2) + ':' 
           + SUBSTRING(CAST(msdb.dbo.sysjobservers.last_run_duration AS VARCHAR(6)), 
              5, 2) AS VARCHAR(8)) 
        END AS VARCHAR(8)) AS LastRunDuration 
FROM sysjobs LEFT OUTER JOIN 
msdb.dbo.sysjobservers ON msdb.dbo.sysjobs.job_id = msdb.dbo.sysjobservers.job_id INNER JOIN 
sysjobschedules ON sysjobs.job_id = sysjobschedules.job_id 
WHERE sysjobs.enabled = 1 
ORDER BY Start_time,sysjobs.name 
END 

このスクリプトは、MSDBでUDFが必要です。ここでは関数のコードは次のとおりです。

USE [msdb] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION [dbo].[udf_schedule_description] (@freq_type INT , 
@freq_interval INT , 
@freq_subday_type INT , 
@freq_subday_interval INT , 
@freq_relative_interval INT , 
@freq_recurrence_factor INT , 
@active_start_date INT , 
@active_end_date INT, 
@active_start_time INT , 
@active_end_time INT) 
RETURNS NVARCHAR(255) AS 
BEGIN 
DECLARE @schedule_description NVARCHAR(255) 
DECLARE @loop INT 
DECLARE @idle_cpu_percent INT 
DECLARE @idle_cpu_duration INT 

IF (@freq_type = 0x1) -- OneTime 
BEGIN 
SELECT @schedule_description = N'Once on ' + CONVERT(NVARCHAR, @active_start_date) + N' at ' + CONVERT(NVARCHAR, cast((@active_start_time/10000) as varchar(10)) + ':' + right('00' + cast((@active_start_time % 10000)/100 as varchar(10)),2)) 
RETURN @schedule_description 
END 
IF (@freq_type = 0x4) -- Daily 
BEGIN 
SELECT @schedule_description = N'Every day ' 
END 
IF (@freq_type = 0x8) -- Weekly 
BEGIN 
SELECT @schedule_description = N'Every ' + CONVERT(NVARCHAR, @freq_recurrence_factor) + N' week(s) on ' 
SELECT @loop = 1 
WHILE (@loop <= 7) 
BEGIN 
IF (@freq_interval & POWER(2, @loop - 1) = POWER(2, @loop - 1)) 
SELECT @schedule_description = @schedule_description + DATENAME(dw, N'1996120' + CONVERT(NVARCHAR, @loop)) + N', ' 
SELECT @loop = @loop + 1 
END 
IF (RIGHT(@schedule_description, 2) = N', ') 
SELECT @schedule_description = SUBSTRING(@schedule_description, 1, (DATALENGTH(@schedule_description)/2) - 2) + N' ' 
END 
IF (@freq_type = 0x10) -- Monthly 
BEGIN 
SELECT @schedule_description = N'Every ' + CONVERT(NVARCHAR, @freq_recurrence_factor) + N' months(s) on day ' + CONVERT(NVARCHAR, @freq_interval) + N' of that month ' 
END 
IF (@freq_type = 0x20) -- Monthly Relative 
BEGIN 
SELECT @schedule_description = N'Every ' + CONVERT(NVARCHAR, @freq_recurrence_factor) + N' months(s) on the ' 
SELECT @schedule_description = @schedule_description + 
CASE @freq_relative_interval 
WHEN 0x01 THEN N'first ' 
WHEN 0x02 THEN N'second ' 
WHEN 0x04 THEN N'third ' 
WHEN 0x08 THEN N'fourth ' 
WHEN 0x10 THEN N'last ' 
END + 
CASE 
WHEN (@freq_interval > 00) 
AND (@freq_interval < 08) THEN DATENAME(dw, N'1996120' + CONVERT(NVARCHAR, @freq_interval)) 
WHEN (@freq_interval = 08) THEN N'day' 
WHEN (@freq_interval = 09) THEN N'week day' 
WHEN (@freq_interval = 10) THEN N'weekend day' 
END + N' of that month ' 
END 
IF (@freq_type = 0x40) -- AutoStart 
BEGIN 
SELECT @schedule_description = FORMATMESSAGE(14579) 
RETURN @schedule_description 
END 
IF (@freq_type = 0x80) -- OnIdle 
BEGIN 
EXECUTE master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', 
N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent', 
N'IdleCPUPercent', 
@idle_cpu_percent OUTPUT, 
N'no_output' 
EXECUTE master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', 
N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent', 
N'IdleCPUDuration', 
@idle_cpu_duration OUTPUT, 
N'no_output' 
SELECT @schedule_description = FORMATMESSAGE(14578, ISNULL(@idle_cpu_percent, 10), ISNULL(@idle_cpu_duration, 600)) 
RETURN @schedule_description 
END 
-- Subday stuff 
SELECT @schedule_description = @schedule_description + 
CASE @freq_subday_type 
WHEN 0x1 THEN N'at ' + CONVERT(NVARCHAR, cast(
CASE WHEN LEN(cast((@active_start_time/10000)as varchar(10)))=1 
    THEN '0'+cast((@active_start_time/10000) as varchar(10)) 
    ELSE cast((@active_start_time/10000) as varchar(10)) 
    END  
as varchar(10)) + ':' + right('00' + cast((@active_start_time % 10000)/100 as varchar(10)),2)) 
WHEN 0x2 THEN N'every ' + CONVERT(NVARCHAR, @freq_subday_interval) + N' second(s)' 
WHEN 0x4 THEN N'every ' + CONVERT(NVARCHAR, @freq_subday_interval) + N' minute(s)' 
WHEN 0x8 THEN N'every ' + CONVERT(NVARCHAR, @freq_subday_interval) + N' hour(s)' 
END 
IF (@freq_subday_type IN (0x2, 0x4, 0x8)) 
SELECT @schedule_description = @schedule_description + N' between ' + 
CONVERT(NVARCHAR, cast(
CASE WHEN LEN(cast((@active_start_time/10000)as varchar(10)))=1 
    THEN '0'+cast((@active_start_time/10000) as varchar(10)) 
    ELSE cast((@active_start_time/10000) as varchar(10)) 
    END  
as varchar(10)) + ':' + right('00' + cast((@active_start_time % 10000)/100 as varchar(10)),2)) 
+ N' and ' + 
CONVERT(NVARCHAR, cast(
CASE WHEN LEN(cast((@active_end_time/10000)as varchar(10)))=1 
    THEN '0'+cast((@active_end_time/10000) as varchar(10)) 
    ELSE cast((@active_end_time/10000) as varchar(10)) 
    END  
as varchar(10)) + ':' + right('00' + cast((@active_end_time % 10000)/100 as varchar(10)),2)) 


RETURN @schedule_description 
END 

私はこれまでのところ持っていると、問題が何であるかを見つけるためにしようと、あまりにも多くの時間を費やしてきました。助けてください。

答えて

5

エラーがあり、コンパイル時に行うことができますバージョンを取得します

Msg 207, Level 16, State 1, Line 106 
Invalid column name 'freq_type'. 
Msg 207, Level 16, State 1, Line 106 
Invalid column name 'freq_interval'. 
Msg 207, Level 16, State 1, Line 107 
Invalid column name 'freq_subday_type'. 
Msg 207, Level 16, State 1, Line 107 
Invalid column name 'freq_subday_interval'. 
Msg 207, Level 16, State 1, Line 107 
Invalid column name 'freq_relative_interval'. 
Msg 207, Level 16, State 1, Line 108 
Invalid column name 'freq_recurrence_factor'. 
Msg 207, Level 16, State 1, Line 108 
Invalid column name 'active_start_date'. 
Msg 207, Level 16, State 1, Line 108 
Invalid column name 'active_end_date'. 
Msg 207, Level 16, State 1, Line 109 
Invalid column name 'active_start_time'. 
Msg 207, Level 16, State 1, Line 109 
Invalid column name 'active_end_time'. 
Msg 207, Level 16, State 1, Line 110 

私はプリントを追加し、彼らは表示されません。

カラム名が実行中のデータベースと互換性がないため、コードに問題があります。 SQL Server 2005には、「sysjobschedules.freq_type」列はありません。

ストアドプロシージャXYZを作成し、2000バージョンを2000データベースに格納し、同じXYZプロシージャを2005マシンに配置し、2005バージョンをそれに入れます。必要な場合は必要ありません...

実行このコード

EDIT:今

PRINT 'will not see this' 
SELECT xyz from sysjobschedules 

PRINT 'Works' 

は今、これを試して、このコード

PRINT 'will not see this' 
error 

を実行しますこれを実行してみてください、だけPRINT行をハイライト:

PRINT 'you can see this' --only select this line of code and run it 
SELECT xyz from sysjobschedules 

は、コンパイルエラーは、あなたがこのような何かを試してみてください

EDIT

を実行しているから何かを防ぐ方法を見て...

DECLARE @Query varchar(max) 

IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='8' 
BEGIN 
    SET @Query=...... 
END 
IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='9' 
BEGIN 
    SET @Query=...... 
END 

EXEC (@Query) 
+0

SQL 2005のボックスでIF..productversionが '9'を返すブロックだけを実行してみてください。正しい結果セットを返します。レポートを生成するために複数のボックスでこれを実行し、実行時に製品バージョンを決定する必要があります。したがって、IFの構成 – Raj

+0

2000ボックスを2000ボックスにインストールし、2005バージョンを2005ボックスにインストールするには、同じストアドプロシージャ名を使用します。コードの一部のみを強調表示して実行すると、無効な列が含まれておらず、その部分が機能します。 –

+0

問題は、2000と2005のミックスで127個のボックスをクエリしなければならず、これらすべてのボックスにSPを作成したくないということです。私はコンパイル時の問題のあなたの答えに同意しますが、それは2000年の箱でうまくいくのですか?実行時にSPを作成し、照会して報告する以外の方法がありますか? – Raj

0

2008年にコードを試してみましたが、正常に動作しました。それを実行するときにmsdbデータベースにいますか?

は(私は2005年に走った)あなたもこの

SELECT 
PARSENAME(CONVERT(VARCHAR(100),SERVERPROPERTY('ProductVersion')),4) 
AS SqlServerVersion 
+0

はい私はそうです。 USEのMSDBステートメントがあるので、実際には問題になりません。 – Raj

+0

それを考えると、SQLのバージョンチェックはSQL 2008で10を返してはいけませんか?私はそれを処理していないし、コードは理想的には2008年の結果を返すべきではありません! – Raj

+0

詳細を教えてください...どのようなエラーが出ていますか? – SQLMenace

2

元の質問は2000,2005にのみ関連していますが、2000年、2005年、2008年およびonwで動作するはずのコードですards

DECLARE @ver NVARCHAR(128) 
DECLARE @majorVersion int 
SET @ver = CAST(SERVERPROPERTY('productversion') AS NVARCHAR) 
SET @ver = SUBSTRING(@ver,1,CHARINDEX('.',@ver)-1) 
SET @majorVersion = CAST(@ver AS INT) 
IF @majorVersion < 11 
    PRINT 'Plesae Upgrade' 
ELSE 
    PRINT @majorVersion 
関連する問題