【发布时间】:2018-01-11 11:29:25
【问题描述】:
我将这段代码放在一起,并在 SSMS 中完美运行。不幸的是,ADO 或 VBA 都不会接受它,因为子查询返回多个项目。我不太确定如何重写它以获得相同的输出。我需要的是pfsO 中与pfsJQ 中也存在sL 中的项目共享相同[JOB_ID] 的前6 个项目。这样做的替代方法是什么?
错误:
描述:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
VBA 代码:
Set conn = New ADODB.Connection
Set cmd = New ADODB.Command
constr = "Provider=sqloledb;data source=1.2.3.4;initial catalog=THECATALOG;user id=THEUSER;password=THEPASSWORD"
conn.Open constr
With cmd
.ActiveConnection = conn
.CommandTimeout = 2
.CommandType = adCmdStoredProc
.CommandText = "rt_sp_sys_nextOptics"
Set rst = .execute
End With
If Not rst.EOF = True Then
i = 0
Do While Not rst.EOF
Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "SerNo") '[PLC]OrderFulfillment_NextOptics[0].SerialNumber
eTag.Value = rst(0)
Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "Stk") '[PLC]OrderFulfillment_NextOptics[0].Stack
eTag.Value = rst(1)
Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "Try") '[PLC]OrderFulfillment_NextOptics[0].Tray
eTag.Value = rst(2)
Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "Psn") '[PLC]OrderFulfillment_NextOptics[0].Position
eTag.Value = rst(3)
Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "XFP") '[PLC]OrderFulfillment_NextOptics[0].PartIsXFP
Select Case rst(4)
Case Is = "XFP"
eTag.Value = 1
Case Is <> "XFP"
eTag.Value = 0
End Select
Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "RawPn") '[PLC]OrderFulfillment_NextOptics[0].SerialNumber
eTag.Value = rst(5)
Set eTag = ThisDisplay.tagDisplay.item("_Eventwatcher").EGroup.item("Machine\NextOptic" & i & "Label") '[PLC]OrderFulfillment_NextOptics[0].SerialNumber
eTag.Value = rst(6)
i = i + 1
rst.MoveNext
Loop
End If
SQL 代码:
SELECT TOP 6 pfsO.[SERIAL_NUMBER], pfsO.[RACK], pfsO.[TRAY], pfsO.[POSITION], ff.[FORM_FACTOR_DESCRIPTION], pfsJQ.[RAW_PART_NUMBER], pfsJQ.[LABEL]
FROM [ROBOTICS_OPTICS_MECHUAT].[dbo].[PULL_FROM_STOCK_OPTICS] AS pfsO
LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[PULL_FROM_STOCK_JOB_QUEUE] AS pfsJQ
ON pfsO.[JOB_ID] = pfsJQ.[JOB_ID]
LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[FORM_FACTOR] as ff
ON ff.[FORM_FACTOR_ID] = pfsJQ.[FORM_FACTOR_ID]
WHERE pfsJQ.[SELECTED] = 'True'
AND pfsJQ.[COMPLETED] = 'False'
AND pfsO.[COMPLETED] = 'False'
AND EXISTS (
SELECT sL.[SERIAL_NUMBER] FROM [ROBOTICS_OPTICS_MECHUAT].[dbo].[STORAGE_LOCATIONS] AS sL
WHERE sL.[SERIAL_NUMBER] = pfsO.[SERIAL_NUMBER]
)
【问题讨论】:
-
这在 SSMS 中无法完美运行。如果您在 SSMS 中访问与使用 ADO 或 VBA 相同的数据源,则会收到相同的错误。
-
显示你的 VBA 代码?
-
除了 Exists 子句,我没有看到子查询。 Exists 不会抛出该错误。我的猜测是您的 ADO 查询与此不同。
-
稍微绕道....您有前 6 名,但没有按顺序排列。你甚至不能确定你会得到哪 6 行。
-
@RandyMinder 我添加了 VBA 代码。不确定它会有所帮助,但这就是我在这里的原因:)
标签: sql sql-server vba sql-server-2012 ado