我使用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
请问您如何纠正此问题?预先感谢。
答案 0 :(得分:1)
Sean Lange评论插入语句不会返回任何有用的信息,而是对查询结果状态的确认,因此它是否出错。
根据sql代码,我假设您正在对SQL Server进行查询,并且无法访问具有必需访问权限的DB,而您使用的tempdb :-)足够公平。
但是,您代码中的问题是,只有最后一部分才从最后开始 StrQry,即带有“插入...”直到“ Sheets(1).Range ....”起作用的那个。其他先前的StrQry分配只是被最后一个覆盖。
您可以通过根据T-SQL语法在可能的情况下简单地删除它们,并在SQL-Server自行处理代码行时排长行来解决您的许多延续问题。
所以,代码可能看起来像这样
getEmails()
对我来说不清楚的是您希望插入的语句在Sheet1的A2中传递并显示的内容。 如果您想显示插入的行,则必须在其中添加
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
或
;select * from #temp_ImprtSampVol;
在StrQry的末尾。 注意丢失的“;”在“输出”前面,因为它属于插入语句。
答案 1 :(得分:0)
不好意思。我必须对此更加精确。 在附加最后提到的零件之前,必须先删除“;”在您的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)向DBA询问一些空间。 :-)