2017-06-29 3 views
2

現在ExcelのブックにあるセルにSQLクエリを格納し、セル値を変数に渡すフレームワークをテストしています。この変数は、その後rs.Open query, cnを通じて実行されます:ADODBに渡されるクエリの長​​さには制限がありますか?

Dim rs As ADODB.Recordset 
Dim cn As ADODB.Connection 

と私は、 "クエリ" のためにこれらを試してみました:

Dim query as String 
Dim query as Variant 

、あるいは固定長クエリで遊ん:演奏中

Dim query as String * 9999 

クエリ文字列の出力で、8000辺りのどこかで切り捨てられます.Googleは私のために近づいてきているので、私はここで回答に来ています。変数がrecordset.Open()に渡すことができるものには特定の制限がありますか?

NB:私は、この特定のクエリのために使用しています接続文字列は次のとおりです。 のConnectionString = "ユーザーID =ユーザー、パスワード= PW;データソース= DB;プロバイダ= OraOLEDB.Oracle"

しかし、あなたが知っていればOracle、NetezzaSQL、またはMS SQL Server(SQLOLEDB.1)のシステム固有の制限があるかどうかを教えてください。ストアドプロシージャに変換する必要がある新しいクエリを定義するために、それぞれの制限を指定する必要があります。

は、ここでは、コードの必需品である:

Sub RunQueryTable() 

Dim cn As ADODB.Connection 
Dim RS As ADODB.Recordset 
Dim iCols As Integer 
Dim DB As String, User As String, PW As String 
Dim SQLTable As Worksheet 
Dim ConnectionString as String 
Dim query As String 'Or Dim query As Variant 'Or Dim query As String * 9999 
Dim i As Long 
etc, etc. 

Set SQLTable = Sheet32 
Set cn = New ADODB.Connection 
Set RS = New ADODB.Recordset 

DB = _____ 
User = ______ 
PW = ____ 

ConnectionString = "User ID=" & User & _ 
        ";Password=" & PW & _ 
        ";Data Source=" & DB & _ 
        ";Provider=OraOLEDB.Oracle" 

query = SQLTable.Cells(i, 3).Text 

cn.Open (ConnectionString) 
RS.CursorType = adOpenForwardOnly 
RS.Open (query), cn 

For iCols = 0 To RS.Fields.count - 1 
    Worksheets("Output").Cells(1, iCols + 1).Value = RS.Fields(iCols).Name 
Next 
Worksheets("Output").Cells(2, "A").CopyFromRecordset RS 

RS.Close 
cn.Close 

End Sub 

私はVBAから取得しています特定のエラーがある:「ORA-00923:予想どこキーワードは見つかりません」クエリが切断取得しているため。

query = SQLTable.Cells(i, 3).Text 

を考えてみましょう:

+0

あなたの実際のコードと、使用しているデータベースを追加してください。 –

+0

なぜVBAコードに8K +文字のインラインSQLクエリがありますか?ストアドプロシージャについて聞いたことがありますか?彼らは不思議に思う! –

+0

8Kの文字が意味をなさないと言うと、それは 'nvarchar(max)'です(SQL Serverを仮定して質問を明確にしてください)。おそらくADODBではなくサーバーによって駆動されるでしょう。 –

答えて

1

はここにあなたの問題です

Range("A1").Value=string(12000,"*") 
? len(range("a1").value) '>> 12000 
? len(range("a1").text) '>> 8221 
+0

いいね!私はまだ何も持っていないと思うけど、簡単なクエリは良い維持可能なソリューションです。 8000文字以上のクエリの編集は、Excelセルではなく、SSMS(またはお気に入りのRDBMSでSQLを編集するために使用するもの)で行われます。彼らはストアドプロシージャをする必要があるという感覚を振ることができません。 –

+0

合意 - 大規模なクエリはすべて、通常、リスト内の "in"リストの使用に起因します。 –

+0

@TimWilliamsあなたの答えを正しく理解しているかどうか教えてください。本質的には、セルの長さを12,000文字の固定長に設定しています。私がそれをした後、私はレコードセットを開くために使用できる変数に長い文字列長を渡すことができますか? –

関連する問題