我们在.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等,并修改变量的处理方式。但有没有更好的选择?
答案 0 :(得分:1)
如果要以编程方式通过sqlcommand执行sql脚本,则需要打开该文件并逐行读取。当您传递每一行时,将其附加到当前批处理字符串构建器,当您在修剪为GO后点击一行时,获取字符串构建器ToString并执行该批处理。清除当前批次并继续。
编辑:问题的第二部分 就参数而言,你可以将它们替换为解析和执行的一部分,或者你可以将诸如创建数据库的职责放到C#代码中。作为首选,我始终保持开发人员可以通过ssms和sqlcmd运行sql脚本,即使它们恰好是作为部署的一部分由C#代码运行。这意味着,我不会编写任何只有你的代码才能理解的特殊标记。您可以保留原样,在脚本中替换它们,将变量声明并注释掉 - 这样开发人员就可以轻松地在ssms中工作。