sql - 对象名称无效,但对象显然有效
问题描述
我正在尝试在 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 更改为我发布的第一个查询时,它会失败。我所有的其他查询都使用这种方法。
解决方案
即使这是简单的语法错误,您确实应该考虑不要使用游标来做一些简单的事情。这应该是一种基于集合的方法,而不是 RBAR(逐行痛苦)。您的整个光标逻辑可以简化为此。您可能会考虑使用存储过程,而不是将所有 sql 逻辑隐藏在应用程序中。为您提供更多控制权,并且几乎在每个方面都更容易。
UPDATE [EWOM].[dbo].[Equipment] SET eqNum =
REPLACE(REPLACE(equipmentID, ' ', ''), '.', '')