0

毎日実行する必要のあるTSQLスクリプトがたくさんあります。Job Agentを使用してそれらを実行できることは知っていますが、実際のジョブを変更する必要があります。

私がやりたいのは、単純に次のようなジョブを作成することです。

execute all TSQL-scripts in <some folder>

スクリプトのファイル名に基づいてフィルターを使用できる場合は、ボーナスがあります。1つのジョブが、名前が「d」で始まるすべてのファイルを実行し、別のジョブが、名前に「w」が含まれるすべてのファイルを実行するようにします。 。

これはできますか?これはどのように行うことができますか?

Windowsスケジューラを使用してSQLCMDユーティリティを実行することについて説明したいくつかのことを読みました。むしろ、SQLServerにスケジューリングと実行を行わせたいです。Powershellは進むべき道ですか?もしそうなら、どこからどのように始めますか?(使用する必要がなかったので、あまり注意を払わなかった:/)

私と一緒に考えてくれてありがとう!

ヘンロ

4

3 に答える 3

2

ファイルからスクリプトを実行するには、次を使用できます。

DECLARE @dir varchar(100) = 'C:\MyDir\'
DECLARE @file varchar(100) = 'myScript.sql'
DECLARE @cmd varchar(100) = 'sqlcmd -S ' + @@SERVERNAME + ' -i ' + @dir + @file

EXECUTE dbo.xp_cmdshell @command_string = @cmd

ディレクトリからファイルのリストを取得するには、次を使用できます

CREATE TABLE #tbl (Name varchar(400))
DECLARE @cmd varchar(100) = 'dir ' + @dir + ' *.sql'
INSERT #tbl EXECUTE dbo.xp_cmdshell @command_string = @cmd

DELETE FROM #tbl WHERE  ISDATE(SUBSTRING(Name,1,10)) = 0
UPDATE #tbl SET Name = SUBSTRING(Name, 40, 100)
于 2012-08-23T14:22:46.807 に答える
1

私はあなたが1つのことをすることができると思います:

  1. 名前「d」で始まるすべてのスクリプトを1つのsprocに配置します。ここでは、sprocの各スクリプトの後にGoを配置する必要があります。

  2. 同様に、文字「w」で始まるすべてのスクリプトを使用して、もう1つのsprocを作成します。

  3. 次に、SQLサーバーエージェントでこれらのジョブをスケジュールします。

于 2012-08-23T14:21:26.893 に答える
0

João、あなたの助けに感謝します。あなたのコードを使用して私はこれを作成しました:set dateformat dmy

DECLARE @scripts varchar(100) = 'C:\MYSCRIPTS\'     -- folder with scripts
DECLARE @project varchar(100) = 'PROJECTX'  -- specific folder
DECLARE @Identifier varchar(1) = 'D' -- All files of which the name starts with a 'T'
DECLARE @files  varchar(100) = @scripts + @project + '\' + @Identifier + '*.sql'

CREATE TABLE #tbl1 (Name varchar(400))
DECLARE @cmd varchar(100) = 'dir ' + @files 
INSERT #tbl1 EXECUTE master.dbo.xp_cmdshell @command_string = @cmd
DELETE FROM #tbl1 WHERE  ISDATE(SUBSTRING(Name,1,10))  = 0
UPDATE #tbl1 SET Name = SUBSTRING(Name,37, 100)

CREATE TABLE #tbl2 (Counter smallint Primary Key IDENTITY(1,1), Name varchar(400))
INSERT INTO   #tbl2 (Name)
Select  @scripts + @project + '\' + Name from #tbl1

DECLARE @i int
DECLARE @NumRows int
DECLARE @File2BExecuted varchar(100)

SET @i = 1
SET @NumRows = (SELECT COUNT(*) FROM #tbl2)
IF @NumRows > 0
    WHILE  (@i <= (SELECT MAX(Counter) FROM #tbl2))
    BEGIN
    SELECT @File2BExecuted = Name FROM #tbl2 WHERE Counter = @i
    DECLARE @script varchar(100) = 'sqlcmd -S ' + @@SERVERNAME + ' -i ' + @File2BExecuted
    EXECUTE master.dbo.xp_cmdshell @command_string = @script

    SET @i = @i + 1
    END

drop table #tbl1
drop table #tbl2
于 2012-08-24T08:01:03.937 に答える