Sql server 子查询返回了多个值。我该如何解决这个问题

Sql server 子查询返回了多个值。我该如何解决这个问题,sql-server,xml,tsql,subquery,Sql Server,Xml,Tsql,Subquery,我正在努力获得输出 你好护理 但最终得到一个错误子查询返回的值超过1。 任何帮助都将不胜感激 下面是我的SQL查询 declare @tmp1 table(ProductId nvarchar(256),Extended nvarchar(max)) insert into @tmp1 values(1,' <xp><p id="181"><v>@1@</v></p><p id="184"> <v>@

我正在努力获得输出

你好

护理

但最终得到一个错误子查询返回的值超过1。 任何帮助都将不胜感激

下面是我的SQL查询

declare @tmp1 table(ProductId nvarchar(256),Extended nvarchar(max))
insert into @tmp1 values(1,'

<xp><p id="181"><v>@1@</v></p><p id="184"> 
    <v>@2@</v></p></xp>')

declare @tmp2 table(ID int,Descr nvarchar(max))
insert into @tmp2 values(181,'aa')
insert into @tmp2 values(184,'bb')


declare @tmp5 table(ID int,Name nvarchar(max),propID int)
insert into @tmp5 values(1,'hi',181)
insert into @tmp5 values(2,'how',181)
insert into @tmp5 values(3,'are',181)
insert into @tmp5 values(1,'take',184)
insert into @tmp5 values(2,'care',184)
insert into @tmp5 values(3,'bye',184)


declare @tmp3 table(ProductId nvarchar(256),Extended nvarchar(max),rownum int)
insert into @tmp3
select ProductId,
Isnull((Select  t5.name from @tmp5 t5 inner join @tmp2 t2 on t5.id + ',' + 
t5.propID =item + ',' + t2.id and t5.propID=t2.id and  
convert(nvarchar(max),t5.id)= item),item)Extended
,DENSE_RANK()Over( order by productid ) 
 from @tmp1 t1
CROSS APPLY dbo.SplitString([Extended] ,'@')  
select * from @tmp3

有些事情你确实应该避免:

将XML存储为NVARCHAR 除非是严格的XHTML,否则可以认为HTML与XML相同 用字符串方法处理XML 只要这是有效的XML或XHTML,您就可以尝试以下方法:

你的样品

declare @tmp1 table(ProductId nvarchar(256),Extended nvarchar(max))
declare @tmp1 table(ProductId nvarchar(256),Extended nvarchar(max))
insert into @tmp1 values('P1','<xp><p id="181"><v>1</v></p><p id="184"><v>2</v></p></xp>') 
                       ,('P2','<xp><p id="184"><v>3</v></p><p id="184"><v>1</v></p></xp>') 

declare @tmp2 table(ID int,Descr nvarchar(max))
insert into @tmp2 values(181,'aa')
insert into @tmp2 values(184,'bb')


declare @tmp5 table(ID int,Name nvarchar(max),propID int)
insert into @tmp5 values(1,'hi',181)
insert into @tmp5 values(2,'how',181)
insert into @tmp5 values(3,'are',181)
insert into @tmp5 values(1,'take',184)
insert into @tmp5 values(2,'care',184)
insert into @tmp5 values(3,'bye',184)
结果,例如一行

<xp>
  <p id="aa">
    <v>hi</v>
  </p>
  <p id="bb">
    <v>care</v>
  </p>
</xp>
简而言之:

我们使用APPLY在类型化列中获取XML。如果源表中的列是类型化的,则更好 我们使用APPLY读取元素,再使用一个APPLY检索值。 我们加入其他的桌子 我们使用FOR-XML构建了一个新的XML
提示:您正在使用字符串拆分函数来处理@。这可能指向多个值,如@1@2@,但您提供的样品没有显示。如果需要,可以尝试拆分返回的p_Val并加入此列表。

这是无效的SQL选择t5.name,从t5.id+'、'+t5.propID=item+'、'+t2.id和t5.propID=t2.id上的@tmp5 t5内部join@tmp2 t2中选择t5.name,然后转换为t5.id=item。我甚至不知道你想在这里实现什么。此外,SQL server内部的HTML构建是不可靠的。SQL Server根本不是为此而设计的。您的总体目标是什么?基本上需要从数据库生成报告。我需要基于上述3个表的输出,因为信息太少,我无法处理。您可能应该使用construct来生成HTML。有很多教程和其他关于如何执行此操作的信息。此外,您还没有回答我关于无效SQL的第一条评论。此查询效果良好。但当我在@tmp1中插入多行时,它会以相同的XML给出所有结果。例如,如果我在@tmp1值'P1'中输入INSERT,'p id=181>1

2

'INSERT into tmp1值'P2','p id=184>3

1

,那么您的查询将给我的结果是[

hi

take

其中,我正在寻找以下表格形式的输出ProductID Extended P1

hi

take

P2

care

bye

@ish_dev,有效点。。。请参阅我的最新答案。诀窍是,让XML创建为具有类型提示的相关子查询。@ish_dev,总是乐于帮助。。。如果这解决了您的问题,那么最好通过检查验收来结束问题。这将标记此线程为已回答,并将向您和我的帐户支付一些点数。
<xp>
  <p id="aa">
    <v>hi</v>
  </p>
  <p id="bb">
    <v>care</v>
  </p>
</xp>