【发布时间】:2019-05-15 15:37:07
【问题描述】:
我正在尝试在 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 更改为我发布的第一个查询时,它会失败。我的所有其他查询都使用这种方法。
【问题讨论】:
-
我唯一能想到的是 objCmd ConnectionString 不正确,如果表存在
-
为什么要使用游标来更新表格?这应该是一条更新语句,而不是一次更新一行,速度非常慢。
-
你的数据库的排序规则是什么?在您声明有效的代码中,您有一个大写 E,但在您失败的代码中,它是 e
-
你明白了,肖恩·兰格。是小写的 e 把所有东西都扔掉了。我有点沮丧,因为我错过了这么简单的东西,但我会注意到 Access VBA 自动将“e”小写,因为它有时喜欢为您格式化代码。我复制并粘贴了所有这些,所以我认为这可能不是问题,但我忘记了 Access VBA 的自动格式化。
-
还有,肖恩,您建议如何更新表格?来自数据库源的 ID 带有空格和句点,我认为我需要循环并使用 Replace() 删除它们。有没有更有效的方法来做到这一点?
标签: sql sql-server ms-access