3

特定の SQL Server サーバー/インスタンスで SQL Server ジョブを自動的に作成する SQL Server 展開スクリプトを作成しています。script job as => Create To を使用して、SQL Server ジョブを自動的に作成するために使用できる sql ステートメントを抽出できることがわかりました。

私の混乱は、データベース名と所有者アカウント名が、生成されたSQLスクリプトにハードコードされていることです。sqlcmd を使用して別のコンピューターで sql スクリプトを実行し、展開を実行する場合、データベース名と所有者アカウント名が異なる可能性があるため、データベース名と所有者アカウント名を SQL Server ジョブ作成スクリプトに渡す方法が必要です。スクリプトで、提供されたデータベース名と所有者アカウント名 (ハードコードされたもの以外) を使用できるようにします。

それを行う方法はありますか?

4

5 に答える 5

4

ジョブ スクリプトを動的に作成してから実行する必要があります。次のようなことを試すか、これをジョブ所有者とデータベース名の入力パラメーターを持つストアド プロシージャに変更できます。

DECLARE @JobName VARCHAR(20)  --Job Name
DECLARE @Owner VARCHAR(200)   --Job Owner
DECLARE @DBName VARCHAR(200)  --Database Name
DECLARE @JobCode VARCHAR(4000) --Create Statement for Job
SET @JobName = 'Test2'
SET @Owner = 'BrianD'
SET @DBName = 'master'
SET @JobCode = 'USE msdb
GO
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N''[Uncategorized (Local)]'' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N''JOB'', @type=N''LOCAL'', @name=N''[Uncategorized (Local)]''
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N''' + @JobName + ''', 
        @enabled=1, 
        @notify_level_eventlog=0, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=0, 
        @delete_level=0, 
        @description=N''No description available.'', 
        @category_name=N''[Uncategorized (Local)]'', 
        @owner_login_name=N''' + @Owner + ''', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N''Version and Prod Level'', 
        @step_id=1, 
        @cmdexec_success_code=0, 
        @on_success_action=1, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N''TSQL'', 
        @command=N''select SERVERPROPERTY(''''productversion''''), SERVERPROPERTY(''''productlevel'''')'', 
        @database_name=N''' + @DBName + ''', 
        @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N''(local)''
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO'
Exec (@JobCode)

うまくいけば、これがあなたを正しい方向に導くでしょう。さらにサポートが必要な場合はお知らせください。

于 2009-08-01T16:14:30.020 に答える
3

BrainD の例を使用して、変数を使用するという彼の考えは問題ないことを指摘したいと思いますが、動的 SQL を使用してそれらをストアド プロシージャに渡すことは、間違いなく正しいアプローチではありません。代わりに、ストアド プロシージャのパラメーターを使用して、変数を必要な場所に直接渡します。

DECLARE @JobName VARCHAR(20)  --Job Name
DECLARE @Owner VARCHAR(200)   --Job Owner
DECLARE @DBName VARCHAR(200)  --Database Name
DECLARE @JobCode VARCHAR(4000) --Create Statement for Job
SET @JobName = 'Test2'
SET @Owner = 'BrianD'
SET @DBName = 'master'

BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name= @JobName, 
        @enabled=1, 
        @notify_level_eventlog=0, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=0, 
        @delete_level=0, 
        @description=N'No description available.', 
        @category_name=N'[Uncategorized (Local)]', 
        @owner_login_name= @Owner, 
        @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Version and Prod Level', 
        @step_id=1, 
        @cmdexec_success_code=0, 
        @on_success_action=1, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N'TSQL', 
        @command=N'select SERVERPROPERTY(''productversion''), SERVERPROPERTY(''productlevel'')', 
        @database_name=@DBName, 
        @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
于 2012-04-02T15:59:43.917 に答える
2

上記の BrianD の回答に加えて、sqlcmd レベルで変数 (実際には変数よりもプリプロセッサ マクロに似ています) を定義できます。これらは、先頭に $ 記号が付いた括弧で囲まれています。

SET @JobName = '$(JobName)'
SET @Owner = '$(Owner)'

これにより、-v スイッチを使用して、コマンド ラインの情報を sqlcmd に渡すことができます。

sqlcmd -... -i create_jobs.sql -v JobName=Job1 -v Owner=BrianD
于 2009-08-01T22:34:34.013 に答える
1

私は今日同じ問題に遭遇していましたが、それに取り組む方法はとても簡単です。

  1. パラメータ @serverName nvarchar(128) を使用してジョブを作成するストアド プロシージャを作成します。

    Create Proc CreateAJob(@serverName nvarchar(128))
    
  2. これで簡単に、次を使用してサーバー名を取得できます

    Declare @serverName nvarchar(128)
    SELECT @servername=@@SERVERNAME
    
  3. ストアド プロシージャを実行してジョブを作成する

    EXEC CreateJob @serverName
    

それだ。

Visual Studio db プロジェクトを使用しており、デプロイ後のスクリプトで手順 2 と 3 を実行しました。

于 2012-11-21T20:50:26.590 に答える
0

私はそれをさらに良くしました...パラメーターなしでストアドプロシージャを作成し、ストアドプロシージャ内で次のことを行います。

   Declare @serverName nvarchar(128)
   SELECT @servername=@@SERVERNAME

次に、以下のように @servername を sp_add_jobserver の server_name パラメータに割り当てます。

msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name =@serverName

SQL ジョブを作成するストアド プロシージャを作成するには、最初に SQL Management Studio を使用して作成し、次にジョブを右クリックして [Drop and Create...] を実行します。

于 2012-11-26T22:10:42.643 に答える