在 SQL Server 中使用 OLE DB 运行多个命令或 sql 脚本

Posted

技术标签:

【中文标题】在 SQL Server 中使用 OLE DB 运行多个命令或 sql 脚本【英文标题】:Run multiple commans or sql script using OLE DB in SQL Server 【发布时间】:2010-06-27 12:11:41 【问题描述】:

是否可以使用 OLE DB 运行多个命令或 sql 脚本?例如运行 sql 脚本来创建数据库及其结构(表、索引、存储过程...)。

当我使用 CCommand 类时,我只能运行一个命令。如何使用多个命令运行 SQL 脚本?

谢谢, 马丁

【问题讨论】:

你想同时运行还是一个接一个地运行? 您的问题不清楚。你想达到什么目的?在不同线程上同时运行多个命令,还是仅使用同一个 Command 对象依次运行多个命令? 我想用多个命令依次运行脚本。 【参考方案1】:

分隔TSQL语句的GO命令不是SQL命令,而是只被前端识别的语句。

因此,在将结果传递给命令对象之前,您需要在“\nGO”处将脚本显式拆分为多个命令。

【讨论】:

【参考方案2】:

Martin - 我也遇到过同样的问题。我假设当您加载一个包含一个或多个“go”的脚本时会出现错误?

我过去曾使用 SQL DMO 来运行带有 GO 的脚本。这确实需要在您的目标计算机上安装 SQLDMO。

另一种选择是使用 .NET "String.Split("GO")" 函数,循环生成的字符串数组,逐个执行。

像这样:

StreamReader file = File.OpenText("c:\\MyScript.sql");
SqlConnection conn = new SqlConnection("My connection string here...");
string fullCommand = file.ReadToEnd();
string[] splitOptions = new string[] "go", "GO", "gO", "Go" ;
foreach (string individualCommand in fullCommand.Split(splitOptions, StringSplitOptions.RemoveEmptyEntries))

    SqlCommand comm = new SqlCommand(individualCommand, conn);
    comm.ExecuteNonQuery();

免责声明:我没有测试上面的代码,但它应该让你知道需要什么:-)

【讨论】:

是的,那是我的问题。我使用的是 C++ 和 OLE DB,而不是 ADO .NET,仅此而已。我会试试。谢谢 @martin - 您可能还需要检查 Go 是否位于行首,以降低它不恰当地分成批次的风险(例如,如果您的表名包含字符串 @ 987654322@) - 或者只是使用其他一些不太可能的分隔符。【参考方案3】:

我已经发送了多个语句,例如 INSERT INTO;INSERT INTO(SQL Server 中不需要分号。

某些语句(如 CREATE FUNCTION)必须是“批处理”中的第一个语句。在 SSMS 和 sqlcmd 中,您有一个 GO 分隔符,它是用于分隔批次的客户端工具。这不是 OLEDB 功能,因此您必须单独发送它们 - 在单独的串行或并行调用中(取决于您的操作是否可以同时运行)。

如果你可以摆脱 CCommand,我猜你可以启动 sqlcmd,因为它支持 GO 批处理分隔符。

【讨论】:

是的;我通常只用分号分隔。如果它不是本地服务器,您可以使用它来排队“无害”查询组以减少往返

以上是关于在 SQL Server 中使用 OLE DB 运行多个命令或 sql 脚本的主要内容,如果未能解决你的问题,请参考以下文章