2013-07-11 2 views
0

У меня есть следующий 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 параметра.

+0

, в чем проблема? –

+0

@mehow Тот факт, что я должен декларировать ** 11 ** параметров вместо 4. В C#, например, я мог бы сделать это только с использованием 4. Также он очень медленный. – Dan

+0

, если вас не беспокоят инъекции, тогда сломайте строку и вставьте 4 параметра, как если бы вы заменяли строку переменными –

ответ

0

Я уверен, что есть правильный способ сделать это, но в конце я только что сделал UDF в БД, который позволяет мне использовать только 4 параметра, а также некоторые команды и процедуры T-SQL, которые иначе не будут Работа. Но если кто-то знает подходящую альтернативу, напишите об этом!