2017-03-01 22 views
1

これは、スタックオーバーフローに関する私の最初の質問です。私はこのサイトからたくさんのことを学んだが、私が持っている問題の答えを見つけることができなかった。レコードが返されないCTEを使用したExcel VBA ADODB SQLクエリ

SQL Server 2008 R2管理スタジオで動作するSQLクエリがありますが、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 

私のコードは、A出力しますイミディエイトウィンドウの "-1"

上記の ";"を追加しました。別の質問応答の勧告に基づいて私の質問に返す。違いはありません。私は原因だけで明確な部分の説明のテーブルのレコード全体を収集するために必要にCTEを使用しています

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

:私は次のクエリ文字列を確認しました

はレコードセットを返します。私はモーターが20回注文されたことを知りたくありません。私はモーターがそれに関連する他のフィールドと一緒に少なくとも一度注文されたことを確認したいと思います。私は、モーター1万台のレコードがありますが、500個の異なるタイプのレコードがある73万レコードのテーブルを探しています。

同じ結果が得られる場合は別のクエリを使用していますが、私の現在のクエリがレコードを生成していない理由は本当に興味があります。私はそれがADODBとVBAの不一致のためではないことを願っています。

私は他の人から質問をいただき、ありがとうございました。ありがとうございました。

+0

私は試してみましたが、MSSQL 2012を使用していますが、問題は再現できません。完全なSQL(異なるテーブル)と同じVBAオブジェクトとプロパティ。 Recordcountは正の数値を返します。接続文字列(テストする他の唯一の変数)の* Driver *とは何ですか?レコード数にかかわらず、クエリは何も返しませんか? – Parfait

+0

接続文字列にドライバ設定がありません...わかりにくい接続文字列は... "Provider = SQLOLEDB.1;データソース= server.address; uid =ユーザー; pwd =パスワード;初期カタログ= myDB" 。クエリは、レコード数に関係なく何も返しません。 – user7638417

+0

うわー! *プロバイダを使用しても、あなたの問題を再現することはできません。おそらくあなたはドライバを試してみるべきです: 'DRIVER = {SQL Server};サーバ=サーバ;データベース= myDB; UID =ユーザ; PWD =パスワード;' SELECT main。* FROM(SELECT ...)ASメインWHERE main.i = 1'。 – Parfait

答えて

1

パフェは私の元の質問に対するコメントの私の解決策を提供しました。接続文字列プロバイダをドライバに変更しても機能しませんでした。それは原因でしたRun-time error '-2147467259 (80004005)'

私はCTEの代わりに、私のクエリで派生テーブルを利用しました。

VBAで私のためのRecordCountを返すSQLクエリは次のとおりです。

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

SQL Server 2005でCTEが導入された理由はこれがMSSQLのバージョン(つまり2008 R2)および/またはOLEDBプロバイダとの対話でなければなりません!それ以降のバージョン(2012/2014/2016)にアクセスできる場合は、最後にCTEをお試しください。 – Parfait

関連する問題