這是我的第一個關於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的兼容性。
非常感謝您收到他人提供的所有幫助,我非常感謝您能爲我提供的任何幫助。
我嘗試過,但嘗試過,但不能重現您的問題,雖然我使用MSSQL 2012.精確的SQL(不同的表)和相同的VBA對象和屬性。 Recordcount返回正數。什麼是連接字符串中的* Driver *(唯一要測試的其他變量)?無論記錄數是否查詢返回任何東西? – Parfait
我沒有連接字符串中的驅動程序設置...我的模糊連接字符串是...「Provider = SQLOLEDB.1; Data Source = server.address; uid = user; pwd = password; Initial Catalog = myDB」 。無論記錄計數如何,查詢都不會返回任何內容。 – user7638417
哇!即使使用*提供者*我也無法重現您的問題。也許你應該試試Driver:'DRIVER = {SQL Server}; server = server; database = myDB; UID = user; PWD = password;'嘗試使用派生表(CTE的替代):'SELECT main。* FROM(SELECT ...)主要在哪裏main.i = 1'。 – Parfait