0

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

我想做的是创建一个简单地说:

execute all TSQL-scripts in <some folder>

如果可以根据脚本的文件名使用过滤器,那么一个好处是:这样一个作业将执行名称以“d”开头的所有文件,另一个作业将执行所有名称中带有“w”的文件.

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

我阅读了一些关于使用 Windows 调度程序运行 SQLCMD 实用程序的内容。我宁愿让 SQL Server 进行调度和执行。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. 将所有以名称 'd' 开头的脚本放在一个 sproc 中。在这里,您必须将 Go 放在 sproc 中的每个脚本之后。

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

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

于 2012-08-23T14:21:26.893 回答
0

若昂,感谢您的帮助。使用您的代码我生成了这个: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 回答