0

我们在 .sql 文件中有一个 SQL 脚本。它有几个像这样定义的参数

DECLARE @device_directory NVARCHAR(250) = '$(CONFIG_DBPATH)'+'$(CONFIG_DBNAME)'

然后我们在 .bat 脚本中执行这个脚本:

SET CONFIG_DBNAME=NewConfigBase
SET CONFIG_DBPATH=C:\BT_Server\
sqlcmd -I -S .\SQLEXPRESS8  -i SetUpConfigDb.sql

作为我们配置工具的一部分,我被分配了实现此功能的任务,即创建物理 db 文件并将其附加到数据库。稍后,我们还将包括当前在单独的 .sql 脚本中定义的数据库表、存储过程等的创建。

理想情况下,我希望配置工具不依赖于 sqlcmd,而是在进程中执行脚本(例如,通过使用 SqlCommand)。这将允许我使用标准错误处理(异常)而不是解析 sqlcmd 的输出。

现在我有点不确定如何解决这个问题。我希望能够重用我们现有的 sql 脚本,以便我们仍然可以使用我们的 .bat 脚本,而无需维护执行相同任务的两个不同的 sql 查询。

其中一个脚本在几个地方包含 GO。我的理解是 SqlCommand 不允许这样做。我也不确定是否可以使用 SqlParameter 来设置 $(CONFIG_DBPATH) 等的值(实际上我几乎可以肯定我不能)。

所以我的问题是,解决这种情况的推荐方法是什么?如何执行带有 GO 的 .sql 命令,以及如何指定变量以便可以从 .bat 文件和托管代码中使用脚本?我想一种选择是在从代码执行脚本时“清洗”脚本,删除 GO 等,并修改变量的处理方式。但是有没有更好的选择?

4

1 回答 1

1

如果你想通过 sqlcommand 以编程方式执行 sql 脚本,那么你需要打开文件并逐行读取。当您传递每一行时,将其附加到当前的批处理字符串构建器,当您点击修剪后为 GO 的行时,获取字符串构建器 ToString 并执行该批处理。清除当前批次并继续。

编辑:问题的第二部分就参数而言,您可以将它们替换为解析和执行的一部分,也可以将诸如创建数据库之类的职责转移到 C# 代码中。作为首选项,我始终让开发人员可以通过 ssms 和 sqlcmd 运行 sql 脚本,即使它们碰巧在部署过程中由 C# 代码运行。这意味着,我不会编造任何只有您的代码才能理解的特殊标记。您可以在您的问题中保留原样,在脚本中替换它们和上面的内容,声明变量并注释掉 - 这样开发人员就可以轻松地在 ssms 中工作。

于 2011-09-05T12:11:54.147 回答