Jonathan Allen Asked: 2012-02-25 11:08:04 +0800 CST2012-02-25 11:08:04 +0800 CST 2012-02-25 11:08:04 +0800 CST SQL Server 中有“包含文件”的概念吗? 772 我有一组需要按特定顺序运行的脚本。我想创建一个“主文件”,列出所有其他文件及其正确顺序。基本上就像来自 C++ 或 ASP/VBScript 的包含文件。 sql-server 5 个回答 Voted Best Answer Michael Fredrickson 2012-02-25T11:23:34+08:002012-02-25T11:23:34+08:00 如果您使用的是SQLCMD,则可以使用:r FileName包含一个单独的 .sql 文件。 :r 文件名 将 FileName 指定的文件中的其他 T-SQL 语句和 SQLCMD 命令解析到语句缓存中。FileName 是相对于 Visual Studio 的启动目录读取的。在遇到批处理终止符后读取并执行文件。您可以发出多个 :r 命令。该文件可以包含任何 SQLCMD 命令,包括在工具、选项中定义的批处理终止符。您可以在部署前或部署后脚本中使用 :r 来包含其他脚本。 bernd_k 2012-02-26T02:40:38+08:002012-02-26T02:40:38+08:00 在古代C 预处理器的意义上绝对没有 T-SQL 本身没有这个概念 SSMS 的 sqlcmd 和 sqlcmdmode 不处理相对文件路径 SSMS 的 sqlcmd 和 sqlcmdmode 不支持条件包括 如果您有一组具有给定绝对路径的文件,并且希望以无条件的顺序包含这些文件,则可以使用命令行工具 sqlcmd 或在 sqlcmdmode 中使用 SSMS,如 @mfredrickson 和 @Marian 所述。 但是,如果您想要相对路径或条件包含,则需要使用一些调用 sqlcmd 的包装器(或其已弃用的前身 isql 或 osql 之一)。 目前在这种情况下,我正在审查和扩展旧的 vbs 和 hta 代码。我并不完全高兴,但这是一个务实的决定。它正在工作,最终用户在家中使用 hta GUI,不需要额外的软件安装。 对于一个全新的设计,我会开始考虑使用 WPF 和 PowerShell 来包装对 sqlcmd 的调用,但是对于我们当前的客户,我无法假设 PowerShell V2 的存在。 甚至在以前,我们为此目的编写了简单的 cmd 批处理,其中一些仍在使用中。 我想目前有一些工具,尤其是那些针对工作流的工具,可能适合这里。我不熟悉那些。 Marian 2012-02-25T12:04:47+08:002012-02-25T12:04:47+08:00 除了 Management Studio 中的SQLCMD 模式外,您还可以使用批处理文件作为主文件,使用SQLCMD 实用程序来排列和调用所有 sql 文件。 SQLCMD 模式是对 Management Studio 内部实用程序使用的模拟,因此这些模式之间没有太大区别。除了有时我更喜欢运行批处理(不再打开 M Studio...加载正确的数据库...等)。我更喜欢在批处理中配置所有内容,包括输出文件。 A-K 2012-02-26T12:00:10+08:002012-02-26T12:00:10+08:00 我同意,急需一个 T-SQL 预处理器。我用 C# 开发了自己的一个,花了我一个小时。除了控制 SQL 脚本的执行顺序之外,它还允许我拥有看起来像标量 UDF 并且使用方便但执行速度与内联 UDF 一样快的宏。 user507 2012-02-26T16:27:25+08:002012-02-26T16:27:25+08:00 我喜欢bernd_k 的回答。根据您命名脚本的方式(例如包含数字),如果您运行的是 SQL Server 2008 或更高版本,则可以使用 SQL Server PowerShell (SQLPS)。然后,即使您使用的是 SQL 2005,您也可以使用 PowerShell 和 2005 的 SMO。 旁注:我相信 SQLCMD 最终会被列入弃用名单,并被 SQLPS、PowerShell 取代。 还有其他一些选择。 将每个脚本设置为 SQL 代理作业中的一个步骤。您可以设置它们的执行顺序。 创建一个 SSIS 包来调用每个文件。这可以提供更多的控制并提供更多的日志记录选项。如果需要在执行下一个脚本之前验证一个脚本的结果,我喜欢这种方法。
如果您使用的是SQLCMD,则可以使用
:r FileName
包含一个单独的 .sql 文件。在古代C 预处理器的意义上绝对没有
如果您有一组具有给定绝对路径的文件,并且希望以无条件的顺序包含这些文件,则可以使用命令行工具 sqlcmd 或在 sqlcmdmode 中使用 SSMS,如 @mfredrickson 和 @Marian 所述。
但是,如果您想要相对路径或条件包含,则需要使用一些调用 sqlcmd 的包装器(或其已弃用的前身 isql 或 osql 之一)。
目前在这种情况下,我正在审查和扩展旧的 vbs 和 hta 代码。我并不完全高兴,但这是一个务实的决定。它正在工作,最终用户在家中使用 hta GUI,不需要额外的软件安装。
对于一个全新的设计,我会开始考虑使用 WPF 和 PowerShell 来包装对 sqlcmd 的调用,但是对于我们当前的客户,我无法假设 PowerShell V2 的存在。
甚至在以前,我们为此目的编写了简单的 cmd 批处理,其中一些仍在使用中。
我想目前有一些工具,尤其是那些针对工作流的工具,可能适合这里。我不熟悉那些。
除了 Management Studio 中的SQLCMD 模式外,您还可以使用批处理文件作为主文件,使用SQLCMD 实用程序来排列和调用所有 sql 文件。
SQLCMD 模式是对 Management Studio 内部实用程序使用的模拟,因此这些模式之间没有太大区别。除了有时我更喜欢运行批处理(不再打开 M Studio...加载正确的数据库...等)。我更喜欢在批处理中配置所有内容,包括输出文件。
我同意,急需一个 T-SQL 预处理器。我用 C# 开发了自己的一个,花了我一个小时。除了控制 SQL 脚本的执行顺序之外,它还允许我拥有看起来像标量 UDF 并且使用方便但执行速度与内联 UDF 一样快的宏。
我喜欢bernd_k 的回答。根据您命名脚本的方式(例如包含数字),如果您运行的是 SQL Server 2008 或更高版本,则可以使用 SQL Server PowerShell (SQLPS)。然后,即使您使用的是 SQL 2005,您也可以使用 PowerShell 和 2005 的 SMO。
旁注:我相信 SQLCMD 最终会被列入弃用名单,并被 SQLPS、PowerShell 取代。
还有其他一些选择。