C# 执行参数化的.sql命令

C# 执行参数化的.sql命令,c#,.net,sql,sql-server-2008,sql-scripts,C#,.net,Sql,Sql Server 2008,Sql Scripts,我们在.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 我的任务是将此

我们在.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等,并修改变量的处理方式。但是还有更好的选择吗?

如果希望通过sqlcommand以编程方式执行sql脚本,则需要打开文件并逐行读取。当您传递每一行时,将其附加到当前的批处理字符串生成器,当您到达修剪后的行时,让字符串生成器ToString并执行该批处理。清除当前批次并继续

编辑:问题的第二部分
就参数而言,您可以将其替换为解析和执行的一部分,也可以将诸如创建DBs之类的任务提取到C#代码中。作为首选,我总是让开发人员能够运行ssms和sqlcmd的sql脚本,即使它们在部署过程中碰巧由C#代码运行。这意味着,我不会编造任何只有您的代码才能理解的特殊标记。您可以保留问题中的原样,替换它们,然后在脚本中声明并注释变量,这样开发人员就可以轻松地在ssms中工作。

好的,这当然是解决问题的一种方法,谢谢!这只是回答了我问题的一部分,然而,如何处理参数仍然是我感兴趣的问题。我想——按照这种方法——因为我已经在解析文件了,所以我也可以将参数修改成SqlCommand可以理解的东西……您可以在解析和执行批处理时替换这些参数,或者可以将动态部分(如创建db(设备目录等)移到C#代码中。作为个人偏好,我总是喜欢sql脚本可以在SSMS或sqlcmd中运行,即使它们碰巧也由部署代码运行;保留一个可由配置工具和通过sqlcmd等使用的脚本。