计划执行文件夹中的所有SQL脚本

时间:2012-08-23 14:01:55

标签: sql-server-2008 tsql jobs sql-server-agent

我有一堆需要每天执行的TSQL脚本。 我知道我可以使用Job Agent来执行它们,但这需要我改变实际的工作。

我想做的是创建一份简单说明的工作:

execute all TSQL-scripts in <some folder>

如果可以根据脚本的文件名使用过滤器,则可以获得奖励:因此,一个作业将执行名称以“d”开头的所有文件,另一个作业将执行所有带有“w”的文件在名称中。

可以这样做吗?如何才能做到这一点?

我读过一些关于使用Windows调度程序来运行SQLCMD实用程序的内容。 我宁愿让SQL Server进行调度和执行。 Powershell是可行的吗?如果是这样,在哪里以及如何开始? (从来没有使用它所以从来没有给予太多关注:/)

感谢您和我一起思考!

Henro

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我想你可以做一件事:

  1. 将所有以名称'd'开头的脚本放在一个sproc中。在sproc中你必须在每个脚本之后放置Go。

  2. 同样创建一个包含所有以字母'w'开头的脚本的sproc

  3. 然后在sql server agent中安排这些作业。

答案 2 :(得分: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