SQL слишком длинный для String - PullRequest
2 голосов
/ 19 марта 2012

У меня есть следующий запрос SQL.Это действительный SQL.К сожалению, это слишком долго для строки в VBA.Кто-нибудь знает обходной путь для выполнения этого запроса?

SQL = "SELECT A.cust_ky, A.incid_id, A.OPEN_TS, A.CLOSE_TS, A.REC_UPD_TS, B.wrkgp_id, A.CURR_AGNT_KY, A.incid_ttl_dn " _
    & "FROM (MAINTBLS.INCID_FAB A INNER JOIN MAINTBLS.DEPTMNT B ON A.curr_wrkgp_ky=B.wrkgp_ky) " _
    & "WHERE B.wrkgp_id='" & wrkgp & "' And (A.open_fg = 1 OR A.pend_fg = 1)" _
    & "ORDER BY A.cust_ky, A.curr_agnt_ky ASC"

rs.Open SQL, con, adOpenKeyset

Ответы [ 4 ]

5 голосов
/ 19 марта 2012

Поскольку вы используете Oracle, вы должны использовать переменную связывания вместо динамического SQL, а затем установить значение в коллекции параметров объекта команды. Это не только предотвратит SQL-инъекцию, но и оптимизирует ваш запрос.

Кроме того, похоже, что в вашем операторе SQL пропущен пробел перед предложением order by. Это может легко вызвать вашу ошибку. Смотрите ниже - не проверено, но должно дать вам идею.

SQL = "SELECT A.cust_ky, A.incid_id, A.OPEN_TS, A.CLOSE_TS, A.REC_UPD_TS, B.wrkgp_id, A.CURR_AGNT_KY, A.incid_ttl_dn " _
    & "FROM (MAINTBLS.INCID_FAB A INNER JOIN MAINTBLS.DEPTMNT B ON A.curr_wrkgp_ky=B.wrkgp_ky) " _
    & "WHERE B.wrkgp_id= :wrkgp And (A.open_fg = 1 OR A.pend_fg = 1) " _
    & "ORDER BY A.cust_ky, A.curr_agnt_ky ASC"

   With cmd
     .ActiveConnection = conn
     .CommandText = SQL
     .CommandType = adCmdText
     .Parameters.Append .CreateParameter(, adVarChar, adParamInput, wrkgp)
   End With
2 голосов
/ 19 марта 2012

Создайте представление для запроса, что-то вроде этого

create view fix_for_broken_vba as
SELECT A.cust_ky, A.incid_id, A.OPEN_TS, A.CLOSE_TS, A.REC_UPD_TS, B.wrkgp_id, 
        A.CURR_AGNT_KY, A.incid_ttl_dn FROM (MAINTBLS.INCID_FAB A INNER JOIN MAINTBLS.DEPTMNT B ON A.curr_wrkgp_ky=B.wrkgp_ky)
    WHERE (A.open_fg = 1 OR A.pend_fg = 1)

и затем переписать запрос соответствующим образом.

0 голосов
/ 28 сентября 2018

Я использовал следующие шаги для запроса 100+ строк

Использование длинного запроса с Excel VBA

  1. Первоначально создать запрос в SSMS
  2. Создайте лист с именем SQL Query
  3. Скопируйте и вставьте запрос в лист запроса SQL и удалите все строки, которые являются пустыми или закомментированными.
  4. Включение любых переменных в оператор объявления
  5. Используйте следующий макрос для циклического просмотра листа SQL-запросов

    LastRowQ = ThisWorkbook.Sheets("SQL Query").Cells(ThisWorkbook.Sheets("SQL Query").Rows.Count, "B").End(xlUp).Row
    
    Count = 2
    Do Until Count > LastRowQ
    
        SQLQTemp = ThisWorkbook.Sheets("SQL Query").Range("B" & Count)
        SQLQuery = SQLQuery & " " & SQLQTemp
    
        Count = Count + 1
    
    Loop
    
    SQLDatabaseRS.Open SQLQuery
    
0 голосов
/ 04 июля 2013

Если вы используете VBA в листе Excel, почему бы вам не рассмотреть вопрос о размещении SQL-запроса в защищенной ячейке вашего документа?Вы даже можете поместить его в скрытый лист вашего документа.

Что-то вроде:

Cells(6, 2).Select
sqlString = Cells(6, 2).Value

Я сделал это, и в моем случае это работает как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...