0
我正在执行一个从Excel中的工作表连接起来的sql语句,并将结果返回给另一个工作表。如果我运行嵌入式嵌套查询,结果返回时没有错误(虽然性能比3分钟和几秒钟慢很多),如果我使用公用表表达式CTE,如下所示我得到运行时错误'3704'该对象被关闭。我正在使用Excel 2010并查询Oracle 11g数据库。在蟾蜍查询工作正常,我似乎记得从Excel对Excel运行CTE查询,所以我不认为这是问题。我无法控制对数据库进行任何更改或将其设置为存储过程。预先感谢任何帮助。vba公用表表达式cte当对象关闭时不允许操作
的完整代码为消毒保密:
Sub RefreshData()
'Turn off screen updating and alerts
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'User cell selection when running macro
Dim iRowRef As Integer
Dim iColRef As Integer
SheetRef = ActiveSheet.Name
iRowRef = ActiveCell.Row
iColRef = ActiveCell.Column
Worksheets("Dashboard").Cells(2, 2).Value = "Start time: " & Now()
'Create connection
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
If strUname = "" Then
strUname = InputBox(Prompt:="USERNAME", Title:="Authentication", Default:=(Environ$("Username")))
End If
If strPword = "" Then
'strPword = InputBox(Prompt:="PASSWORD", Title:="Authentication", Default:="Password")
strPword = modPWMask.InputBoxPW("PASSWORD", "Authentication")
End If
***编辑:问题是与连接字符串中的供应商。 CTE支持依赖提供者。由于@TimWilliams
'Connection string
cn.ConnectionString = "Provider=MSDAORA.1;User ID=" & strUname & ";Password=" & strPword & ";Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = host.com)(PORT = 100))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = db_prd)))"
'Open connection
cn.Open
'Query Data Runoff
strQuery = Worksheets("SQL").Cells(2, 2).Value & UCase(Format(Worksheets("Dashboard").Cells(7, 3).Value, "dd-mmm-yyyy")) & Worksheets("SQL").Cells(2, 3).Value
'Send query string to clipboard
Dim DataObj3 As New MSForms.DataObject
DataObj3.SetText strQuery
DataObj3.PutInClipboard
'Clear old data
Worksheets("Data").Cells.EntireColumn.Hidden = False
Worksheets("Data").Range("C20:E20").ClearContents
'Create recordset from query
Set rs = cn.Execute(strQuery)
这是我收到错误的行:
'Paste data from record set
Worksheets("Data").Range("C20").CopyFromRecordset rs
'Timestamp end time
Worksheets("Dashboard").Cells(3, 2).Value = "Last refreshed: " & Now()
'Turn on screen updating and alerts
Application.ScreenUpdating = True
Application.DisplayAlerts = True
'Return to starting cell
Worksheets(SheetRef).Activate
Cells(iRowRef, iColRef).Select
End Sub
而这又是消毒的保密SQL:
with cte as
(
select
ENTITY
, ENDPOINT
, case
when RWS = 1 and ENDPOINT in (13,14) then PCT_B
when RWS = 2 and ENDPOINT in (13,14) then PCT_A
else PCT_A end as PCT
, SUM(case
when RWS = 1 and ENDPOINT in (13,14) then cast(BAL_B AS decimal (18,2))
when RWS = 2 and ENDPOINT in (13,14) then cast(BAL_A AS decimal (18,2))
when RWS = 2 then cast(BAL AS decimal (18,2))
else 0 end) as BAL
, ROUND(SUM((case
when RWS = 1 and ENDPOINT in (13,14) then cast(BAL_B AS decimal (18,2))
when RWS = 2 and ENDPOINT in (13,14) then cast(BAL_A AS decimal (18,2))
when RWS = 2 then cast(BAL AS decimal (18,2))
else 0 end)
*
(case
when RWS = 1 and ENDPOINT in (13,14) then PCT_B
when RWS = 2 and ENDPOINT in (13,14) then PCT_A
else PCT_A end)
/100),2) as ADJ_BAL
from
SCHEMA.VIEW
cross join (select 1 as RWS from dual union select 2 as RWS from dual)
where
AS_OF_DATE = '01-NOV-2016'
group by
ENTITY
, ENDPOINT
, case
when RWS = 1 and ENDPOINT in (13,14) then PCT_B
when RWS = 2 and ENDPOINT in (13,14) then PCT_A
else PCT_A end
)
select sum(case
when ENTITY = 'ENTITYA' and ENDPOINT <> 33 then ADJ_BAL
when ENTITY = 'ENTITYB' then ADJ_BAL
when ENTITY = 'ENTITYC' and ENDPOINT <> 33 then ADJ_BAL
else 0
end) as BAL_CONSOL
, sum(case
when ENTITY = 'ENTITYA' then ADJ_BAL
else 0
end) as BAL_ENTITYA
, sum(case
when ENTITY = 'ENTITYB' then ADJ_BAL
else 0
end) as BAL_ENTITYB
from cte
含义是行cn.open失败,并且您没有检查连接是否已成功打开。 – xQbert
我可以添加该检查,但在上述检查之前我成功执行了2个其他查询,所以我不认为是这种情况。 ?cn.State 1 – clarencebuttowski
(1)检查'rs.State',而不是'cn.State'(2)检查Connection's Errors集合https://support.microsoft.com/en-us/kb/167957 –