次の SQL クエリがあります。
SELECT SUM(OpenInterest) *(SELECT DISTINCT Future
FROM MTM
WHERE Expiry = [dbo].fx_GetRelativeExpiry(@date, 1, @Code)
and TradeDate = @date
and Code = @Code
and type = @Type
and Class = 'Foreign Exchange Future') / 1000
FROM MTM
WHERE Expiry = [dbo].fx_GetRelativeExpiry(@date, @N, @Code)
and TradeDate = @date
and Code = @Code
and type = @Type
and Class = 'Foreign Exchange Future'
Excelの関数として使用したいもの。問題は、上記のクエリでパラメーターを何度も再利用し、新しい (そして基本的に冗長な) パラメーターを作成せずに Excel でそれを行う方法がわからないことです。これは私のVBAコードです:
Function GetTotalOI(TradeDate As Date, Code As String, OptionType As String, N As Integer) As Variant
'Create and open the connection
Dim oConnection As Connection
Set oConnection = New Connection
oConnection.ConnectionString = strConnectionStringYieldX
oConnection.Open
'Create the command object
Dim oCommand As Command
Set oCommand = New Command
oCommand.CommandType = adCmdText
Dim SQLString As String
SQLString = "SELECT SUM(OpenInterest) * (SELECT DISTINCT Future" _
& " FROM MTM" _
& " WHERE Expiry = [dbo].fx_GetRelativeExpiry(?, 1, ?)" _
& " and TradeDate = ?" _
& " and Code = ?" _
& " and type = ?" _
& " and Class = 'Foreign Exchange Future') / 1000" _
& " FROM MTM" _
& " WHERE Expiry = [dbo].fx_GetRelativeExpiry(?, ?, ?)" _
& " and TradeDate = ?" _
& " and Code = ?" _
& " and type = ?" _
& " and Class = 'Foreign Exchange Future'"
oCommand.CommandText = SQLString
oCommand.ActiveConnection = oConnection
oCommand.Parameters.Append oCommand.CreateParameter("Date1a", adDBTimeStamp, adParamInput)
oCommand.Parameters.Append oCommand.CreateParameter("Code1a", adVarChar, adParamInput, 50)
oCommand.Parameters.Append oCommand.CreateParameter("Date2a", adDBTimeStamp, adParamInput)
oCommand.Parameters.Append oCommand.CreateParameter("Code2a", adVarChar, adParamInput, 50)
oCommand.Parameters.Append oCommand.CreateParameter("Typea", adVarChar, adParamInput, 1)
oCommand.Parameters.Append oCommand.CreateParameter("Date1", adDBTimeStamp, adParamInput)
oCommand.Parameters.Append oCommand.CreateParameter("N", adInteger, adParamInput)
oCommand.Parameters.Append oCommand.CreateParameter("Code1", adVarChar, adParamInput, 50)
oCommand.Parameters.Append oCommand.CreateParameter("Date2", adDBTimeStamp, adParamInput)
oCommand.Parameters.Append oCommand.CreateParameter("Code2", adVarChar, adParamInput, 50)
oCommand.Parameters.Append oCommand.CreateParameter("Type", adVarChar, adParamInput, 1)
oCommand.Parameters.Item("Date1a").Value = TradeDate
oCommand.Parameters.Item("Code1a").Value = Code
oCommand.Parameters.Item("Date2a").Value = TradeDate
oCommand.Parameters.Item("Code2a").Value = Code
oCommand.Parameters.Item("Typea").Value = OptionType
oCommand.Parameters.Item("Date1").Value = TradeDate
oCommand.Parameters.Item("Code1").Value = Code
oCommand.Parameters.Item("N").Value = N
oCommand.Parameters.Item("Date2").Value = TradeDate
oCommand.Parameters.Item("Code2").Value = Code
oCommand.Parameters.Item("Type").Value = OptionType
Dim result As New ADODB.Recordset
Set result = oCommand.Execute
Dim resultA As Variant
GetTotalOI = WorksheetFunction.Transpose(result.GetRows)
oConnection.Close
End Function
コードは機能しますが、混乱しています。必要なパラメーターは 4 つだけです。それを行う方法はありますか??
クエリ文字列の代わりに名前でパラメーターを指定する方法はありますか?
私の接続文字列は次のようになります。
Const strConnectionStringYieldX As String = "Provider=SQLNCLI10.1;Data Source=xxxx;Initial Catalog=xxxx;Uid=xxxx;Pwd=xxxx;"
編集
質問を明確にするために、ADOでは、同じパラメーターを 2 回使用する場合、コードでパラメーターを再作成する必要があることを意味する?
ものではなく、パラメーターを指定する必要があります。@ParamName
これは醜くて不快です。したがって、このクエリでは実際には 4 つのパラメーターしか使用しません。パラメーターを何度も繰り返すため、一意の名前を付けて 11 個のパラメーターを作成する必要があります。date1a
したがって、vba コードを読むと、 、date2a
、date1
および-という名前のパラメーターがあることがわかりますが、これらはすべて同じ日付date2
です! クエリで何らかの名前付きパラメーターを使用するネイティブな方法があると確信しているため、4つのパラメーターを宣言するだけで済みます。