对象名称无效,但对象显然有效

时间:2019-05-15 15:37:08

标签: sql sql-server ms-access

我正在尝试在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更改为我发布的第一个查询时,它将失败。我所有其他查询都使用此方法。

2 个答案:

答案 0 :(得分:2)

即使这是简单的语法错误,您实际上也应该考虑不要将光标用于简单的事情。这应该是一种基于集合的方法,而不是RBAR(通过折行行)。您的整个游标逻辑可以简化为此。您可能会考虑使用存储过程,而不是将所有sql逻辑都埋在应用程序中。赋予您更多的控制权,并且几乎在各个方面都变得更加容易。

UPDATE [EWOM].[dbo].[Equipment] SET eqNum = 
REPLACE(REPLACE(equipmentID, ' ', ''), '.', '')

答案 1 :(得分:0)

塞恩·兰格(Sean Lange)指出了一个显而易见的事实,我本来是向[EWOM]。[dbo]。[设备]提出要求的,当时应该是[设备]。当我复制文本时,该字母大写,但是在粘贴后,Access VBA将其更改为小写,这使我陷入了循环。