用
SET NOCOUNT ON;
声明;
....
SQL_STR1 = "SET NOCOUNT ON; " & vbCrLf & _
"DECLARE @STRSQL AS Varchar(max) " & vbCrLf & _
"DECLARE @TableName VARCHAR(50) " & vbCrLf & _
"DECLARE LoopVal CURSOR FOR SELECT TableName_ FROM [DBASE_NAME].[dbo].[a_Base_Year_Matrices] " & vbCrLf & _
"OPEN LoopVal " & vbCrLf & _
"FETCH NEXT FROM LoopVal INTO @TableName " & vbCrLf & _
"WHILE @@FETCH_STATUS = 0 " & vbCrLf & _
"BEGIN " & vbCrLf & _
....
SET NOCOUNT ON
禁止在任何DML后显示“xx行受影响”消息。这是一个结果集,当发送时,客户端(在本例中是ADO记录集)必须处理它。简单地说,recordset对象不处理这些服务器消息—它需要一个表示基表记录、查询结果或以前保存的记录集的游标。当您的记录集收到服务器消息时,它只会给您一个空的记录集。我猜你的VBA不希望有一个空的记录集,当这种情况发生时,你有一些代码块被卡住了?很难说没有看到所有的VBA。
设置NoCount使服务器跳到recordset对象要处理的好东西(在本例中是查询的结果)。