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

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

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

谢谢, 马丁

【问题讨论】:

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

标签: sql oledb command sql-scripts


【解决方案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 批处理分隔符。

    【讨论】:

    • 是的;我通常只用分号分隔。如果它不是本地服务器,您可以使用它来排队“无害”查询组以减少往返
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2023-03-20
    • 1970-01-01
    • 2018-11-21
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多