0
Msg 512, Level 16, State 1, Line 3
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <,    <= , >, >= or when the subquery is used as an expression.

我有 Id 值作为 varchar,如下所示。

'1,2,3,4,5,6,7,8,9'

我在 ID 列表上方列出,但是如果我有超过 1 行,我会得到上述异常。

DECLARE @List varchar(255)= (SELECT FIRSAT_PERSONELLER_ID FROM FIRSATLAR) 

DECLARE @X XML
SELECT @X  = '<myxml><nodes><n>' + 
REPLACE(@List,',','</n></nodes><nodes><n>') + 
'</n></nodes></myxml>'

SELECT LTRIM(C.value('n[1]','VARCHAR(50)')) AS item1
FROM @X.nodes('/myxml/nodes') Cols (C)
4

2 回答 2

0

在您的子查询中放置一个 MAX:

DECLARE @List varchar(255)= (SELECT MAX(FIRSAT_PERSONELLER_ID) FROM FIRSATLAR) 

但这可能不是故意的。

您可以为从子查询返回的每个值考虑一个游标。

或者,您可以放置​​一个 WHERE 子句以过滤返回的值。

如果您需要逗号分隔的列表:

DECLARE @List varchar(255)
SELECT @List = COALESCE(@List +',' ,'') + FIRSAT_PERSONELLER_ID
FROM FIRSATLAR
于 2013-10-02T11:24:02.200 回答
0

您不需要提取到 XML 变量 @List。您可以在集合上使用 XML 扩展。

对于您的特定示例,我认为您需要:

SELECT  LTRIM(C.value('n[1]','VARCHAR(50)')) AS item1
FROM    (   SELECT  X = CAST('<myxml><nodes><n>' + 
                                REPLACE(FIRSAT_PERSONELLER_ID,',','</n></nodes><nodes><n>') + 
                                '</n></nodes></myxml>' AS XML)
            FROM    FIRSATLAR
        ) t
        CROSS APPLY X.nodes('/myxml/nodes') Cols (C);

SQL Fiddle 示例

于 2013-10-02T11:34:43.730 回答