繁体   English   中英

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

[英]How do I execute a .SQL file from Excel VBA code?

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

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

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

生成.sql文件后,我想从代码中执行该文件并接收成功状态。 我想一口气做到这一点,而不是碰上DB 100或更多次来检查每个语句的状态。

我曾尝试在网上搜索答案,但是没有运气来追踪它。

我怎样才能做到这一点?

如果我无法触发文件,我想我将不得不分别运行每个语句(锁定DB,运行单个删除,运行单个插入),并在每个语句之后检查是否成功。 如果一切正常,请提交或回滚。 那行得通吗?

谢谢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM