【发布时间】:2019-10-28 11:28:00
【问题描述】:
我有一个存储过程,它使用有关使用 TVP 传递给过程的一些文档的数据填充临时表的一部分:
DECLARE @TempDocumentsKeys AS TABLE ( ... );
DocumentID Keyword ProtocolNumber ProtocolDate FolderIndex
----------- --------------- ---------------- ----------------------- -----------
NULL ARCHIVIO 277543 2019-10-02 00:00:00.000 111563
NULL CIAN 277543 2019-10-02 00:00:00.000 111563
NULL RICHIESTA 277543 2019-10-02 00:00:00.000 111563
NULL ABILITAZIONI 277543 2019-10-02 00:00:00.000 111563
NULL ARCHIVIO 277543 2019-10-02 00:00:00.000 128421
NULL CIAN 277543 2019-10-02 00:00:00.000 128421
NULL RICHIESTA 277543 2019-10-02 00:00:00.000 128421
NULL ABILITAZIONI 277543 2019-10-02 00:00:00.000 128421
现在,在同一个过程中,我必须使用已存储到另一个临时表中的新插入的 ID 来更新这个 DocumentID 字段:
DECLARE @InsertedDocuments AS TABLE ( ... );
Keyword DocumentID ProtocolNumber ProtocolDate FolderIndex
------------ ----------- ---------------- ----------------------- -----------
NULL 81 277543 2019-10-02 00:00:00.000 111563
NULL 82 277543 2019-10-02 00:00:00.000 128421
所以@TempDocumentsKeys 临时表应该是这样的:
DocumentID Keyword ProtocolNumber ProtocolDate FolderIndex
----------- --------------- ---------------- ----------------------- -----------
81 ARCHIVIO 277543 2019-10-02 00:00:00.000 111563
81 CIAN 277543 2019-10-02 00:00:00.000 111563
81 RICHIESTA 277543 2019-10-02 00:00:00.000 111563
81 ABILITAZIONI 277543 2019-10-02 00:00:00.000 111563
82 ARCHIVIO 277543 2019-10-02 00:00:00.000 128421
82 CIAN 277543 2019-10-02 00:00:00.000 128421
82 RICHIESTA 277543 2019-10-02 00:00:00.000 128421
82 ABILITAZIONI 277543 2019-10-02 00:00:00.000 128421
.我正在尝试一个简单的UPDATE 声明
UPDATE @TempDocumentsKeys
SET DocumentID =
(SELECT INS.DocumentID FROM @InsertedDocuments AS INS
INNER JOIN @TempDocumentsKeys AS TCD ON
INS.ProtocolNumber = TCD.ProtocolNumber
AND INS.ProtocolDate = TCD.ProtocolDate
AND INS.FolderIndex = TCD.FolderIndex)
但我收到了这个错误:
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
为什么会这样?我不明白,JOIN 中的 ON 子句应该给我一个结果,而不是一组结果...
谢谢,大卫。
【问题讨论】:
-
什么 WHERE 子句?
-
这里的错误非常明确,您拥有的子查询 (
(SELECT INS.DocumentID...)) 返回超过 1 行。引用所述子查询的表达式使用=,并且当子查询返回多行时明确不允许该运算符。 -
@forpas 对不起,你是对的,我的意思是“开”。固定。
标签: sql-server tsql