在 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象
为啥 SQL Server 2008 OLE DB UDL 可能需要明确指定端口 1433?
SQL Server 2008 R2 中缺少 Microsoft Office 12.0 Access 数据库引擎 OLE DB 提供程序?
Microsoft OLE DB Provider for SQL Server 错误 '80040e14'
SSIS OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80004005,无法确定元数据