Sql server 2008 文件夹中所有TSQL脚本的计划执行

Sql server 2008 文件夹中所有TSQL脚本的计划执行,sql-server-2008,tsql,jobs,sql-server-agent,Sql Server 2008,Tsql,Jobs,Sql Server Agent,我有一堆TSQL脚本需要每天执行。 我知道我可以使用作业代理来执行它们,但这需要我更改实际作业 我想做的是创造一份简单的工作,上面写着: execute all TSQL-scripts in <some folder> 如果可以根据脚本的文件名使用过滤器,则会有一个好处:一个作业将执行名称以“d”开头的所有文件,另一个作业将执行名称中以“w”开头的所有文件 这能做到吗?如何做到这一点 我读了一些关于使用Windows调度器运行SQLCMD实用程序的文章。 我宁愿让SQL Serv

我有一堆TSQL脚本需要每天执行。 我知道我可以使用作业代理来执行它们,但这需要我更改实际作业

我想做的是创造一份简单的工作,上面写着:

execute all TSQL-scripts in <some folder>
如果可以根据脚本的文件名使用过滤器,则会有一个好处:一个作业将执行名称以“d”开头的所有文件,另一个作业将执行名称中以“w”开头的所有文件

这能做到吗?如何做到这一点

我读了一些关于使用Windows调度器运行SQLCMD实用程序的文章。 我宁愿让SQL Server进行调度和执行。这是去地狱的路吗?如果是,从哪里开始,如何开始?从未使用过,因此从未给予过太多关注:/

谢谢你和我一起思考


亨罗我想你可以做一件事:

将所有以名称“d”开头的脚本放在一个存储过程中。在这里,您必须在存储过程中的每个脚本后面放置Go

类似地,使用以字母“w”开头的所有脚本再创建一个存储过程

然后在SQLServer代理中计划这些作业


我想你可以做一件事:

将所有以名称“d”开头的脚本放在一个存储过程中。在这里,您必须在存储过程中的每个脚本后面放置Go

类似地,使用以字母“w”开头的所有脚本再创建一个存储过程

然后在SQLServer代理中计划这些作业


要从文件中执行脚本,可以使用:

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)

要从文件中执行脚本,可以使用:

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)

乔,谢谢你的帮助。使用您的代码,我生成了以下内容: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

乔,谢谢你的帮助。使用您的代码,我生成了以下内容: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