【发布时间】:2017-11-29 19:50:43
【问题描述】:
我已经为此苦苦挣扎了好几天。 我有一个应用程序使用 SQL SERVER 数据库来存储它的数据。 这个数据库有几个表、存储过程、函数和视图。 我曾经为部署生成一个大型数据库创建脚本。 现在,我希望每个对象有一个脚本/文件,以及一个运行所有这些脚本的主脚本。 使用 sqlcmd 模式,我制作了一个脚本,列出了路径中的所有文件,并创建了另一个文件,执行该路径中的所有文件。
--DECLARE PATH
:SETVAR WorkDir "C:\scripts\"
--DECLARE TMP FILES
:SETVAR WorkFile "listing.tmp"
:SETVAR RunFile "final_script.txt"
--DELETE PREVIOUS FILE IF EXISTS
!!IF EXIST $(WorkDir)$(RunFile) DEL $(WorkDir)$(RunFile)
!!IF EXIST $(WorkDir)$(WorkFile) DEL $(WorkDir)$(WorkFile)
--REDIRECT OUT TO WORK FILE
:OUT $(WorkDir)$(WorkFile)
--LIST ALL SQL FILES
!!DIR $(WorkDir)"*.sql" /b/o
--APPEND EXECUTE COMMAND
!!FOR /F "usebackq tokens=*" %a in (`dir /b $(WorkDir)*.sql /on`) DO ( @ECHO :r "$(WorkDir)%a">> $(WorkDir)$(RunFile) )
--EXECUTE "final_script"
:r $(WorkDir)$(RunFile)
此脚本将生成另一个脚本,其中包含如下内容:
-r: c:\scripts\script_01.sql
-r: c:\scripts\script_02.sql
-r: c:\scripts\script_03.sql
-r: c:\scripts\script_04.sql
我遇到的问题是: 我找不到如何自动创建数据库。 我想在此脚本中设置数据库名称,并从路径脚本中删除对数据库名称的任何引用。
我可以更改此脚本,以便将 CREATE DATABASE 语句附加到最终脚本中,以获得类似的内容
CREATE DATABASE [MYDB]
GO
USE [MYDB]
GO
-r: c:\scripts\script_01.sql
-r: c:\scripts\script_02.sql
-r: c:\scripts\script_03.sql
-r: c:\scripts\script_04.sql
但是,-r 语句会在创建数据库之前执行,脚本会使用 [master] 数据库执行。
如果我在数据库创建语句中包含或创建另一个脚本,我无法告诉数据库应该使用的其他脚本。
有什么想法吗??
最好的问候。-
【问题讨论】:
标签: sql-server sqlcmd