これは、スタックオーバーフローに関する私の最初の質問です。私はこのサイトからたくさんのことを学んだが、私が持っている問題の答えを見つけることができなかった。レコードが返されない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の不一致のためではないことを願っています。
私は他の人から質問をいただき、ありがとうございました。ありがとうございました。
私は試してみましたが、MSSQL 2012を使用していますが、問題は再現できません。完全なSQL(異なるテーブル)と同じVBAオブジェクトとプロパティ。 Recordcountは正の数値を返します。接続文字列(テストする他の唯一の変数)の* Driver *とは何ですか?レコード数にかかわらず、クエリは何も返しませんか? – Parfait
接続文字列にドライバ設定がありません...わかりにくい接続文字列は... "Provider = SQLOLEDB.1;データソース= server.address; uid =ユーザー; pwd =パスワード;初期カタログ= myDB" 。クエリは、レコード数に関係なく何も返しません。 – user7638417
うわー! *プロバイダを使用しても、あなたの問題を再現することはできません。おそらくあなたはドライバを試してみるべきです: 'DRIVER = {SQL Server};サーバ=サーバ;データベース= myDB; UID =ユーザ; PWD =パスワード;' SELECT main。* FROM(SELECT ...)ASメインWHERE main.i = 1'。 – Parfait