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

Sql 对象名称无效,但对象显然有效,sql,sql-server,ms-access,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 @@F

我试图在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]"
让我困惑的是,我展示的第一个查询在SQLServerManagementStudio中运行良好,但在我将其转换为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更改为我发布的第一个查询时,它将失败。我的其他查询都使用这种方法工作。

< P>尽管这是一个简单的语法错误,但是你确实应该考虑不要用游标来简化一些事情。这应该是一种基于集合的方法,而不是RBAR(逐行)。您的整个游标逻辑可以简化为这样。您可以考虑使用存储过程,而不是在应用程序中埋入所有SQL逻辑。让你有更多的控制权,在几乎所有方面都更容易

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

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

我唯一能想到的是objCmd ConnectionString不正确,如果表存在,为什么要使用光标更新表?这应该是一个update语句,而不是一次更新一行慢得让人痛苦。数据库的排序规则是什么?在你说的代码中,你有大写字母E,但在你失败的代码中,你得到了它,肖恩·兰格。正是小写字母把所有的东西都扔掉了。我有点沮丧,因为我错过了这么简单的东西,但我会注意到Access VBA自动将“e”改为小写,因为它有时喜欢为您格式化代码。我复制并粘贴了所有这些内容,所以我认为这不可能是一个问题,但我忘记了Access VBA的自动格式化。还有,Sean,您建议如何更新表?来自DB源的ID带有空格和句点,我想我需要循环使用Replace()来消除它们。有没有一种更有效的方法可以做到这一点?我想知道你是否有意从一开始就这么做。谢谢你,肖恩,这段代码的效率要高得多。