Ошибка с временной таблицей и вставка в оператор в VBA (запрос ADODB) - PullRequest
0 голосов
/ 22 октября 2018

Я использую VBA и ADODB для запросов к серверу SQL Server, и у меня возникают проблемы с оператором INSERT INTO в следующей строке:

StrQuery = "INSERT INTO #temp_ImprtSampVol Values ('RBM','Care: Admin',28)," & _
" ('RRA','Care: Quality',29)"

Сообщение об ошибке: "Неверный синтаксис рядом с",'. Я уверен, что что-то не так с приведенным выше утверждением, но я пытаюсь понять, что может быть не так.

Я хотел бы вставить следующие значения в таблицу (это работаетотлично в SQL):

INSERT INTO #temp_ImprtSampVol 
VALUES 
('RBM','Care: Admin',28),
('RBM','Care: Exit',31),
('RBM','Care: Other',22),
('RRA','Care: Quality',29),
('RRA','Care: Finance',37),

Мой код выглядит следующим образом:

Sub VBAFromSQL()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String

ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=HIDDEN_Outputs;Data Source=HIDDEN;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False"

cnn.Open ConnectionString
cnn.CommandTimeout = 900

StrQuery = "IF OBJECT_ID('tempdb..#temp_MthToDt') IS NOT NULL drop table 
#temp_MthToDt" & _
" IF OBJECT_ID('tempdb..#temp_ImprtSampVol') IS NOT NULL drop table 
#temp_ImprtSampVol" & _
" IF OBJECT_ID('tempdb..#temp_T1') IS NOT NULL drop table #temp_T2AuditData"

StrQuery = "DECLARE @Last_Day_Loaded VARCHAR(30) = '2018-10-03';" & _
" DECLARE @Start_of_Sample VARCHAR(30) = '2018-10-03';" & _
" DECLARE @End_of_Sample VARCHAR(30) = '2018-10-03';" & _
" DECLARE @Days_Data_so_far INT = 03;" & _
" DECLARE @First_Day_Month VARCHAR(30) = '2018-10-01';" & _
" DECLARE @Working_Days_in_Month INT = 23;" & _
" DECLARE @Days_in_Month INT = 31;" & _
" DECLARE @BBE_Sample_Minimum INT = 10;" & _
" DECLARE @BBE_Sample_adjustment_multiplier decimal(5,2) = 1.0;"

StrQuery = "CREATE TABLE #temp_ImprtSampVol (" & _
" CIS VARCHAR(10) NOT NULL," & _
" RD VARCHAR(40) NOT NULL," & _
" Sample_to_send INT NOT NULL );"

StrQuery = "INSERT INTO #temp_ImprtSampVol Values ('RBM','Care: Admin',28)," & _
" ('RRA','Care: Quality',29)"

rst.Open StrQuery, cnn
Sheets(1).Range("A2").CopyFromRecordset rst
End Sub

Не могли бы вы посоветовать, как это исправить? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Простите.Я должен был быть более точным с этим.Перед прикреплением последних упомянутых частей вы должны удалить «;»в конце оператора в вашем StrQry = ....Вот так это выглядит так:

StrQry = "... ;INSERT INTO #temp_ImprtSampVol Values ('RBM','Care: Admin',28),('RRA','Care: Quality',29) output inserted.*;"

или

StrQry = "... ;INSERT INTO #temp_ImprtSampVol Values ('RBM','Care: Admin',28),('RRA','Care: Quality',29);select * from #temp_ImprtSampVol;"

Мне интересно, почему вы отбрасываете эти другие таблицы, которые так или иначе никогда не использовались, и почему там объявлено все этопеременные, но я думаю, что вы хотите расширить запрос.Имейте в виду, что даже у этого способа есть свои ограничения, и вам лучше попросить своего администратора баз данных, скажем, небольшую базу данных, где вы можете создавать SP самостоятельно.:-)

0 голосов
/ 22 октября 2018

Как прокомментировал Шон Ланге, оператор вставки не возвращает ничего полезного, кроме подтверждения состояния результата запроса, поэтому он ошибается или нет.

Согласно sql-коду, я предполагаю, что вы запрашиваете противSQL-сервер, не имеющий доступа к БД с необходимыми правами доступа, достаточно справедливо использует tempdb :-).

Но проблема в вашем коде состоит в том, что только последняя часть, начиная споследний StrQry, а именно тот, с вашим "Вставить в ...", пока "Sheets (1) .Range ...." не окажет никакого влияния.Другие предыдущие назначения StrQry просто перезаписываются последними.

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

Таким образом, код может выглядеть следующим образом

Sub VBAFromSQL()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String

ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=HIDDEN_Outputs;Data Source=HIDDEN;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False"

cnn.Open ConnectionString
cnn.CommandTimeout = 900

StrQuery = "IF OBJECT_ID('tempdb..#temp_MthToDt') IS NOT NULL drop table #temp_MthToDt; IF OBJECT_ID('tempdb..#temp_ImprtSampVol') IS NOT NULL drop table #temp_ImprtSampVol; IF OBJECT_ID('tempdb..#temp_T1') IS NOT NULL drop table #temp_T2AuditData; DECLARE @Last_Day_Loaded VARCHAR(30) = '2018-10-03', @Start_of_Sample VARCHAR(30) = '2018-10-03',@End_of_Sample VARCHAR(30) = '2018-10-03', @Days_Data_so_far INT = 03,@First_Day_Month VARCHAR(30) = '2018-10-01',@Working_Days_in_Month INT = 23,@Days_in_Month INT = 31,@BBE_Sample_Minimum INT = 10,@BBE_Sample_adjustment_multiplier decimal(5,2) = 1.0; CREATE TABLE #temp_ImprtSampVol (CIS VARCHAR(10) NOT NULL,RD VARCHAR(40) NOT NULL,Sample_to_send INT NOT NULL );INSERT INTO #temp_ImprtSampVol Values ('RBM','Care: Admin',28),('RRA','Care: Quality',29);"

rst.Open StrQuery, cnn
Sheets(1).Range("A2").CopyFromRecordset rst
End Sub

Что мне не ясно, это то, что вы ожидали от оператора вставки, который будет доставлен, ипоказано в листе А2.Если вы хотите показать вставленные строки, вы должны добавить либо

;select * from #temp_ImprtSampVol;

, либо

output inserted.*;

в конце StrQry.Помните о пропавшем ";"перед «выводом», так как он принадлежит оператору вставки.

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