我有一堆需要每天执行的TSQL脚本。 我知道我可以使用Job Agent来执行它们,但这需要我改变实际的工作。
我想做的是创建一份简单说明的工作:
execute all TSQL-scripts in <some folder>
如果可以根据脚本的文件名使用过滤器,则可以获得奖励:因此,一个作业将执行名称以“d”开头的所有文件,另一个作业将执行所有带有“w”的文件在名称中。
可以这样做吗?如何才能做到这一点?
我读过一些关于使用Windows调度程序来运行SQLCMD实用程序的内容。 我宁愿让SQL Server进行调度和执行。 Powershell是可行的吗?如果是这样,在哪里以及如何开始? (从来没有使用它所以从来没有给予太多关注:/)
感谢您和我一起思考!
Henro
答案 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)
我想你可以做一件事:
将所有以名称'd'开头的脚本放在一个sproc中。在sproc中你必须在每个脚本之后放置Go。
同样创建一个包含所有以字母'w'开头的脚本的sproc
然后在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