繁体   English   中英

在 SSMS 中使用子查询更新时收到错误

[英]Recieving error when updating with subquery within SSMS

我遇到了一个错误,我的子查询返回的值多于允许的“1”。

我正在尝试使用表 [P] 中的 .QUERY 值更新表 [I]。

两个表都来自不同的数据库。 它们在列 ID 中具有相同的值。 我想先尝试一下 ID 的 100-150 作为测试。

UPDATE I 
    SET I.metadata02 = (SELECT CAST([XML]AS xml)
                            .query(N'/inkoopfacturen/inkoopfactuur/jaar')
                            .value('.', 'varchar(30)') 
                    FROM [Archive190404132717].[dbo].[tblArchiveInvoices])    
FROM tblindex AS I 
    INNER JOIN [Archive190404132717].[dbo].[tblArchiveInvoices] AS P 
        ON  I.ID = P.ID    
WHERE 
    I.tasknumber BETWEEN '100' and '150'

好吧,看起来你真正想要的实际上就是这样:

UPDATE I
SET I.metadata02 = CAST([XML] AS xml).query(N'/inkoopfacturen/inkoopfactuur/jaar').value('.', 'varchar(30)')
FROM tblindex I
     INNER JOIN [Archive190404132717].[dbo].[tblArchiveInvoices] P ON I.ID = P.ID
WHERE I.tasknumber BETWEEN '100' AND '150';

不需要子查询和对tblArchiveInvoices的第二次引用; 你已经加入了。

为什么要同时使用子查询join 我假设你想要一个相关的子查询:

UPDATE I 
    SET I.metadata02 = (SELECT CAST([XML]AS xml)
                               .query(N'/inkoopfacturen/inkoopfactuur/jaar')
                               .value('.', 'varchar(30)') 
                        FROM [Archive190404132717].[dbo].[tblArchiveInvoices]
                        WHERE I.ID = P.ID  
                       )
FROM tblindex I 
WHERE I.tasknumber BETWEEN '100' and '150';

此外,名为tasknumber的字段应该真正存储为数字。 作为字符串的比较可能会产生误导。 如果是数字,去掉单引号。 如果是字符串,你应该意识到'10001满足WHERE条件。

也许你正在尝试这样的事情:

UPDATE I 
SET metadata02 = X
FROM tblindex AS I 
INNER JOIN (SELECT Id, CAST([XML]AS xml).query(N'/inkoopfacturen/inkoopfactuur/jaar').value('.', 'varchar(30)') AS X
            FROM [Archive190404132717].[dbo].[tblArchiveInvoices] ) AS P 
            ON  I.ID = P.ID    
WHERE I.tasknumber BETWEEN '100' and '150'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM