SQL-запрос, сгенерированный Excel, не работает - PullRequest
0 голосов
/ 25 апреля 2018

Привет У меня возникли проблемы с запросом Excel SQL, где я получаю значения из базы данных SQL на основе значений в моей таблице Excel. поэтому я пишу функцию в Excel, которая поместит все значения в запрос, и SQL-соединение будет запускаться и извлекать данные, соответствующие этому значению. проблема, с которой я сталкиваюсь - это (""), так как SQL не нравится это, и мне нравится 'value', но я изменил его, чтобы сделать его единым '', но функции Excel это не нравится. вот что я пишу в функции Excel.

="SELECT TOP 1 Name FROM [SERVER].[dbo].[Table] WHERE

" &TS[[#Headers],[Currency]] & " = """&[@Currency] &""""  
&  
"AND " &TS[[#Headers],[Type]]& " = """&[@Type]&""""  
&  
"AND " &TS[[#Headers],[Report]]& " = """&[@Report ]&""""  
&  
"AND " &TS[[#Headers],[Status]]& " = """&[@Status]&""""      
&  
"AND " &TS[[#Headers],[Target]]& " = """&[@Target]&""""  

, который затем превращается в это.

"SELECT TOP 1 NAME FROM [SERVER].[dbo].[TABLE] WHERE 
Currency = ""EUR""
AND Type = "" 0"" AND  Report  = ""9"" AND  Status = ""0"" AND Target  = ""Reversal"""

вот мой пример таблицы:

Type    Report  Status       Target          Currency
 0       9        0         Reversal         EUR
 0       9        0          ACCEPT          CHI
 0       9        0          NEW             EUR
 0       9        0          OLD             YEN

Моя функция VB:

Function Download_Standard_BOM(Query As String)
'Initializes variables
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String

ConnectionString = "Driver={SQL Server};Server=STORESYSTEM 
;Database=STORE;Trusted_Connection=Yes;"

cnn.Open ConnectionString
StrQuery = Query 'Sheets("Tests Scenario").Range("J2").Offset(i, 0).Value
cnn.CommandTimeout = 100
rst.Open StrQuery, cnn, adOpenStatic, adLockOptimistic
Download_Standard_BOM = rst("NAME")

End Function

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Я предполагаю, что ваши поля SQL уже экранируются двойными кавычками. Если это так, то устранение двойного экранирования, видимого в формуле Excel выше, должно решить проблему:

="SELECT TOP 1 Name FROM [SERVER].[dbo].[Table] WHERE "
&TS[[#Headers],[Currency]] & " = "&[@Currency] 
&" AND " &TS[[#Headers],[Type]]& " = "&[@Type] 
&" AND " &TS[[#Headers],[Report]]& " = "&[@Report] 
&" AND " &TS[[#Headers],[Status]]& " = "&[@Status]  
&" AND " &TS[[#Headers],[Target]]& " = "&[@Target]

Кстати, даже если это решит вашу непосредственную проблему, вы должны иметь в виду, что в большинстве разновидностей SQL одинарные, а не двойные кавычки используются для обозначения строковых литералов.

0 голосов
/ 25 апреля 2018

Попробуйте добавить приведенную ниже функцию в свой VBA

Public Function SQLText(RawText As Variant) As String
    If Not RawText = vbNullString Then
        SQLText = "'" & Replace(RawText, "'", "''") & "'"
    Else
        SQLText = "Null"
    End If
End Function

Если вы ссылаетесь на свой столбец в Excel, оберните имя столбца в SQLText ( yourcolumn )

EDIT: Ссылка на одну из ваших колонок

"& TS [[# Headers], [Currency]] &" = "& SQLTEXT ([@ Currency]) &" "

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