如何从Excel VBA代码执行.SQL文件?

如何从Excel VBA代码执行.SQL文件?,sql,sql-server,excel,vba,Sql,Sql Server,Excel,Vba,*更新到下面* 我决定放弃执行该文件,并决定通过ADO.Execute将UseTransaction设置为True,不返回任何记录集来传递一个长查询字符串。我遇到了一个新问题,虽然错误代码为0,但只插入了一些记录。总执行时间不到一秒。命令超时为30,连接超时为15 在查询中,我运行了6次删除,然后通常是54次插入。数据库中实际出现了大约32个插入行,并且忽略了查询的其余部分,同样没有返回任何错误。SQL server端可能存在超时、最大字符串长度或它可以从ADO接受的最大命令数?如果我将整个查询

*更新到下面* 我决定放弃执行该文件,并决定通过ADO.Execute将UseTransaction设置为True,不返回任何记录集来传递一个长查询字符串。我遇到了一个新问题,虽然错误代码为0,但只插入了一些记录。总执行时间不到一秒。命令超时为30,连接超时为15

在查询中,我运行了6次删除,然后通常是54次插入。数据库中实际出现了大约32个插入行,并且忽略了查询的其余部分,同样没有返回任何错误。SQL server端可能存在超时、最大字符串长度或它可以从ADO接受的最大命令数?如果我将整个查询直接粘贴到SQLServerManagementStudio中,那么无论查询多长时间,整个查询都会执行。SQL Server端似乎有一个限制。思想? *结束更新*

我正在使用Excel数据生成一个复杂的查询,并将其发送到一个文件。该查询锁定数据库,删除记录,使用@variables生成新密钥,并在INSERT语句中使用@variables。最后,它运行一个COMMIT语句。.sql文件中至少有100条语句

生成.sql文件后,我希望从代码中执行该文件并接收成功状态。我希望一次就完成这项工作,而不是单独点击DB 100次或更多次并检查每个语句的状态

我试着在网上搜索答案,但没有找到答案

我该怎么做

如果我不能触发该文件,我想我将不得不单独运行每个语句(lockdb、运行单个deletes、运行单个insert),然后检查每个语句是否成功。如果一切顺利,我承诺或不承诺,请回滚。这样行吗

多谢各位

如果有帮助的话,下面是我的SQL文件的一个示例,以了解包含哪些类型的语句

use MY_DB_NAME; 
declare @i_xseq int;
declare @deleteBeforeInsert int;
set @deleteBeforeInsert = 1;

begin transaction MyTransaction;


-- ***********************************   DELETE FUTURE EVENTS
-- Delete all future records using application ID 12 and having a start date after the start date:

if (@deleteBeforeInsert = 1)
BEGIN

  delete from dbo.TableA
where EVENT_XSEQ in (select X_SEQ from dbo.TAbleB where START > CAST('2014-03-26 14:22:01' as datetime) and APPLICATION_ID = 12);
END

-- ************************************ GET NEXT SEQUENCE #
-- begin retrieve new @i_xseq
select @i_xseq=LAST_ID from [dbo].[AKey] WITH (XLOCK,READPAST) where TABLE_NAME = 'TableB';
Update [dbo].[AKey]
Set LAST_ID = LAST_ID + 1
where TABLE_NAME = 'TableB';

select @i_xseq=LAST_ID from [dbo].[AKey] where TABLE_NAME = 'TableB';
-- end retrieve new @i_xseq

-- RUN Inserts (many)
insert into dbo.TableB
  (VAL1, VAL2,X_SEQ)
Values
  (1110, 37673.70, @i_xseq);

-- *************************************  END AND COMMIT
insert into dbo.SCHEDULE_LOG
(DESCRIPTION, X_UPDATED, X_BY)
Values
('Close_Scheduling', CURRENT_TIMESTAMP, 'MY_ID');

COMMIT transaction MyTransaction;

在单独的模块中,创建一个函数或过程,将SQL语句中的所有行写入字符串。然后将该字符串传递到打开的数据库连接中。 您需要在项目中包含“Mircosoft ActiveX数据对象库”

Public Function rstSomeName()

Dim sSql As String

sSql = ""
sSql = sSql & "use MY_DB_NAME;                               " & vbCrLf
sSql = sSql & "declare @i_xseq int;                          " & vbCrLf
sSql = sSql & " etc.. to the end of you sql statement        " & vbCrLf


Set rstSomeName= New ADODB.Recordset
rstSomeName.Open sSql, "Your Database Connection String"

End Function

字符串将处理超过100000个字符?你知道运行这样的大查询会得到什么样的错误返回吗?您认为我应该停止commit/rollback语句,检查错误状态,然后发送commit或rollback,还是最终语句必须是第一个事务的一部分?VBA字符串的限制约为2GB,约为20亿个字符。我更关心的是,您是否能够通过数据连接传递那么多信息,不管是什么。在这种情况下。为什么不将其创建为存储过程并从vba代码中调用呢?任何错误都是Oracle返回的错误,您可以在出现错误时处理这些错误。最后,如果您的SQL代码现在在数据库上运行,那么您不必修改任何SQL代码,将其传递到数据库也不成问题。谢谢。我尝试了你的一些想法,并更新了我上面的问题。你能再看一眼吗?在尝试存储过程之前,我需要获得客户端的许可。这只是一个想法,但不是让它成为一个长字符串。为什么不装几块呢?你可以分阶段做。加载字符串1…提交…加载字符串2提交。。。等。这样你可能会发现错误更容易。嗨,基思-没有产生错误。如果我将整个长查询粘贴到SQLServer管理器中,它运行良好。我最终希望这是一个长期的交易,这样我可以回滚整个事情,如果有任何问题。如果我在一个单独的事务中插入一些插入,然后再插入一些,我相信我无法正确地回滚它们。