我正在尝试在MS Access中运行一些SQL查询,但是某个查询的行为很奇怪,并且抛出了一个错误,我认为这掩盖了实际问题。这是有问题的查询:
objCmd.CommandText = "DECLARE @equipID varchar(50) DECLARE d
CURSOR FOR SELECT equipmentID FROM [EWOM].[dbo].[equipment] OPEN d"
& _
" FETCH NEXT FROM d INTO @equipID WHILE @@FETCH_STATUS = 0 BEGIN" &
_
" UPDATE [EWOM].[dbo].[Equipment] SET eqNum =
REPLACE(REPLACE(equipmentID, ' ', ''), '.', '') WHERE equipmentID =
@equipID" & _
" FETCH NEXT FROM d INTO @equipID End Close d DEALLOCATE d"
这会引发错误
无效的对象名称'EWOM.dbo.Equipment'
但是,我已经使用了几个查询,并且使用了完全相同的相同对象。这是一个完全可操作的查询示例:
objCmd.CommandText = "TRUNCATE TABLE [EWOM].[dbo].[Equipment]" & _
" INSERT INTO [EWOM].[dbo].[Equipment] (equipmentID, make, model,
equipmentName, status)" & _
" SELECT Equipment, Manufacturer, Model, Description, Status" & _
" FROM [Vp].[dbo].[bEMEM]"
让我感到困惑的是,我显示的第一个查询在SQL Server Management Studio中运行良好,但是当我将其转换为Access时失败。真正的问题源于第一个查询的语法问题吗?任何帮助将不胜感激。
这是工作查询的完整代码:
Dim Cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim objCmd As New ADODB.Command
Set Cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
Cnn.Open "DBName", "username", "password"
objCmd.ActiveConnection = Cnn
objCmd.CommandText = "TRUNCATE TABLE [EWOM].[dbo].[Equipment]" & _
" INSERT INTO [EWOM].[dbo].[Equipment] (equipmentID, make, model,
equipmentName, status)" & _
" SELECT Equipment, Manufacturer, Model, Description, Status" & _
" FROM [Vp].[dbo].[bEMEM] WHERE EMGroup = 20"
objCmd.CommandType = adCmdText
Set rst = objCmd.Execute
MsgBox "Update successful."
Cnn.close
Set Cnn = Nothing
Set rst = Nothing
当objCmd.commandText更改为我发布的第一个查询时,它将失败。我所有其他查询都使用此方法。
答案 0 :(得分:2)
即使这是简单的语法错误,您实际上也应该考虑不要将光标用于简单的事情。这应该是一种基于集合的方法,而不是RBAR(通过折行行)。您的整个游标逻辑可以简化为此。您可能会考虑使用存储过程,而不是将所有sql逻辑都埋在应用程序中。赋予您更多的控制权,并且几乎在各个方面都变得更加容易。
UPDATE [EWOM].[dbo].[Equipment] SET eqNum =
REPLACE(REPLACE(equipmentID, ' ', ''), '.', '')
答案 1 :(得分:0)
塞恩·兰格(Sean Lange)指出了一个显而易见的事实,我本来是向[EWOM]。[dbo]。[设备]提出要求的,当时应该是[设备]。当我复制文本时,该字母大写,但是在粘贴后,Access VBA将其更改为小写,这使我陷入了循环。