У меня есть следующий 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;"
EDIT
Для выяснения вопроса, в ADO вы должны указать параметры как ?
, а не что-то вроде @ParamName
что означает, если вы используете один и тот же параметр дважды, вы должны воссоздать параметр в своем коде. Что является уродливым и неприятным. Поэтому в этом запросе, где я действительно использую только 4 параметра, потому что я повторяю их много, я должен однозначно назвать и создать 11 параметров. Поэтому, если вы прочитаете код vba, вы увидите, что у меня есть параметры с именем date1a
, date2a
, date1
и date2
- НО ЭТИ ВСЕ ОЧЕНЬ ДАЛЬШЕ! Я уверен, что есть собственный способ использовать какой-то именованный параметр в запросе и, следовательно, нужно только объявить 4 параметра.
, в чем проблема? –
@mehow Тот факт, что я должен декларировать ** 11 ** параметров вместо 4. В C#, например, я мог бы сделать это только с использованием 4. Также он очень медленный. – Dan
, если вас не беспокоят инъекции, тогда сломайте строку и вставьте 4 параметра, как если бы вы заменяли строку переменными –