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

时间:2014-04-03 15:27:28

标签: sql sql-server excel-vba vba excel

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

在查询中,我运行6次删除,然后通常超过54次插入。大约有32个插入的行实际出现在DB中,并且忽略了查询的其余部分,同样没有返回错误。也许SQL服务器端有超时,最大字符串长度或它可以从ADO接受的最大命令数?如果我将整个查询直接粘贴到SQL Server Management Studio中,则无论多长时间都会执行整个查询。 SQL Server端似乎存在限制。想法? *结束更新*

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

生成.sql文件后,我想从代码中执行该文件并获得成功状态。我想一次性完成这项工作,而不是单独敲击DB 100或更多时间并检查每个语句的状态。

我尝试在网上搜索答案,但没有运气跟踪它。

我该怎么做?

如果我无法触发该文件,我想我必须单独运行每个语句(锁定数据库,运行单独的删除,运行单个插入),在每个语句之后检查成功。如果一切顺利,我是COMMIT,如果没有,请做ROLLBACK。那会有用吗?

谢谢。

如果有帮助,这里有一个我的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;

1 个答案:

答案 0 :(得分:0)

在单独的模块中,创建一个函数或过程,将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
相关问题