2017-03-01 93 views
1

這是我的第一個關於Stack Overflow的問題。我從這個網站學到很多東西,但是我一直無法找到我遇到的問題的答案。使用CTE返回沒有記錄的Excel VBA ADODB sql查詢

我有一個SQL查詢可以在SQL Server 2008 R2管理工作室中使用,但在EXCEL 2013中使用vba查詢時無法正常工作。查詢包含一個公用表表達式,並且它不會將任何記錄返回到我的記錄集。

SQL查詢是:

WITH cte AS 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY [partNumber] 
ORDER BY [date] DESC) AS i FROM [myDB].[dbo].[PartOrders] 
WHERE [partDescription] like '%motor%') 

SELECT * FROM cte WHERE i = 1 

我對Microsoft ActiveX數據對象的引用6.1庫

我使用的VBA代碼:

Dim conn as ADODB.Connection 
Dim sql as String 
Dim rst as ADODB.Recordset 

Set conn = New ADODB.Connection 
conn.ConnectionString = myConnectionString 
conn.Open 

sql = ";WITH cte AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY " & _ 
     "[partNumber] ORDER BY [date] DESC) AS i " & _ 
     "FROM [myDB].[dbo].[PartOrders]" & _ 
     "WHERE [partDescription] like '%motor%') " & _ 
     "SELECT * FROM cte WHERE i = 1 " 

Set rst = New ADODB.Recordset 
rst.Open sql, conn, adOpenStatic, adLockReadOnly, adCmdText 

debug.print rst.recordcount 

conn.Close 
Set rst = Nothing 
Set conn = Nothing 

我的代碼打印立即窗口中的「-1」

我已添加前面的「;」根據另一個問題回答的建議來回答我的問題。它沒有什麼區別。

我已經驗證下面的查詢字符串返回一個記錄:

sql = "SELECT *, ROW_NUMBER() OVER (PARTITION BY " & _ 
     "[partNumber] ORDER BY [date] DESC) AS i " & _ 
     "FROM [myDB].[dbo].[partNumbers]" & _ 
     "WHERE [partDescription] like '%motor%'" 

我用一個CTE由於需要收集表的全部記錄,但只有特定部分的描述。我不想看到一個電機訂購了20次。我希望看到發動機至少與其他相關領域一起訂購了一次。我正在搜索730,000條記錄,其中有10000個電機的記錄,但只有500個不同類型的記錄。

我打開使用不同的查詢,如果它將網絡相同的結果,但我真的很好奇,爲什麼我當前的查詢不產生任何記錄。我希望這不是由於ADODB和VBA的兼容性。

非常感謝您收到他人提供的所有幫助,我非常感謝您能爲我提供的任何幫助。

+0

我嘗試過,但嘗試過,但不能重現您的問題,雖然我使用MSSQL 2012.精確的SQL(不同的表)和相同的VBA對象和屬性。 Recordcount返回正數。什麼是連接字符串中的* Driver *(唯一要測試的其他變量)?無論記錄數是否查詢返回任何東西? – Parfait

+0

我沒有連接字符串中的驅動程序設置...我的模糊連接字符串是...「Provider = SQLOLEDB.1; Data Source = server.address; uid = user; pwd = password; Initial Catalog = myDB」 。無論記錄計數如何,查詢都不會返回任何內容。 – user7638417

+0

哇!即使使用*提供者*我也無法重現您的問題。也許你應該試試Driver:'DRIVER = {SQL Server}; server = server; database = myDB; UID = user; PWD = password;'嘗試使用派生表(CTE的替代):'SELECT main。* FROM(SELECT ...)主要在哪裏main.i = 1'。 – Parfait

回答

1

Parfait在我對原始問題的評論中爲我提供了一個解決方案。將連接字符串提供程序更改爲驅動程序不起作用。它造成了一個Run-time error '-2147467259 (80004005)'

而不是CTE,我在我的查詢中使用了派生表。

SQL查詢VBA中返回的RecordCount對我來說是:

SELECT main.* 
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY [partNumber] 
ORDER BY [date] DESC) AS i FROM [myDB].[dbo].[PartOrders] 
WHERE [partDescription] like '%motor%') 
AS main WHERE main.i = 1 

謝謝!

+0

這必須是MSSQL版本(即2008 R2)和/或其與'OLEDB提供程序'的交互,儘管它是爲什麼CTE是在SQL Server 2005中引入的!如果您有權訪問更高版本(2012/2014/2016),請嘗試使用CTE。 – Parfait