【问题标题】:Retrieve Structured Xml from Sql Server Express 2005从 Sql Server Express 2005 中检索结构化 XML
【发布时间】:2011-04-19 11:14:28
【问题描述】:

我想从全文搜索索引表中获得 xml 输出,如下所示。但是我的代码在联合附近生成了不正确的语法 我的代码

SELECT
Table1.Name 'Table1/Name',
Table1.Email 'Table1/Email',
(    SELECT
     Table2.Address 'Address',
     Table2.Phone 'Phone',
     FROM Details Table2
     INNER JOIN Regd Table3 ON Table3.Code = Table2.Code
     AND (Table3.SubCode = xml.SubCode) AND (Table1.Id = Table3.Id)
     FOR XML PATH ('Details'),Type) as 'Table1',
FROM Users Table1
INNER JOIN CONTAINSTABLE(Users,[Name], @SearchKeys) AS KEY_TBL ON Id = KEY_TBL.[KEY]
INNER JOIN Regd Table3 ON Table3.Id = Table1.Id,
OPENXML (@idoc,'/Request/List',2)
WITH (SubCode NVARCHAR(20)) as xml
WHERE  (xml.SubCode = '' or Table3.SubCode = xml.SubCode) AND (Table3.Id = Table1.Id)
FOR XML PATH ('List')
UNION
SELECT
SELECT
Table1.Name 'Table1/Name',
Table1.Email 'Table1/Email',
(    SELECT
     Table2.Address 'Address',
     Table2.Phone 'Phone',
     FROM Details Table2
     INNER JOIN Regd Table3 ON Table3.Code = Table2.Code
     AND (Table3.SubCode = xml.SubCode) AND (Table1.Id = Table3.Id)
     FOR XML PATH ('Details'),Type) as 'Table1',
FROM Users Table1
INNER JOIN CONTAINSTABLE(Users,[Email], @SearchKeys) AS KEY_TBL ON Id = KEY_TBL.[KEY]
INNER JOIN Regd Table3 ON Table3.Id = Table1.Id,
OPENXML (@idoc,'/Request/List',2)
WITH (SubCode NVARCHAR(20)) as xml
WHERE  (xml.SubCode = '' or Table3.SubCode = xml.SubCode) AND (Table3.Id = Table1.Id)
FOR XML PATH ('List')

这是我期望的结果

<List>
<Table1>
<Name></Name>
<Email></Email>
<Details>
<Address></Address>
<Phone></Phone>
</Details>
</Table1>
</List>

我认为请求 xml 参数在这里没有任何用处,因为它只是一个语法错误

【问题讨论】:

  • 你能解释一下你想做什么吗?你只是在向我们抛出一个巨大的复杂 SQL 语句,没有背景,没有关于所涉及的表、它们的结构、它们的数据等的信息。例如是@idoc 您在两个地方使用...它是如何填充的,从什么数据?您能否将其简化为单个 SELECT 并暂时省略 UNION 部分!?!?

标签: c# asp.net xml web-services sql-server-2005


【解决方案1】:

您的代码中有很多语法错误,但我认为它们存在,因为您删除了很多您认为不必要的内容。

你说你得到的错误是Incorrect syntax near the keyword 'union'

这会给你这个错误,

select *
from YourTable
for xml path('list')
union
select *
from YourTable
for xml path('list')

您必须将查询嵌入到这样的选择语句中。

select
(select *
 from YourTable
 for xml path('list'))
union
select
(select *
 from YourTable
 for xml path('list'))

如果您希望列是 XML 类型,则需要添加 type 并使用 union all,因为 The xml data type cannot be selected as DISTINCT because it is not comparable.

select
(select *
 from YourTable
 for xml path('list'), type)
union all
select
(select *
 from YourTable
 for xml path('list'), type)

我不知道这最终是否会给你想要的输出,但这就是Incorrect syntax near the keyword 'union' 的原因以及你可以做些什么。

【讨论】:

  • +1 用于解释为什么做某事可以解决问题
  • 警告,当addressPhone 元素为空/空时,我如何让它考虑列的空值它不会生成一个空的&lt;Details&gt;&lt;/Details&gt; xml 元素跨度>
  • @Deeptechtons - 我认为您必须提出一个新问题,包括一些示例代码和预期输出。当我使用null 值进行测试时,我确实得到一个空的详细信息标签,看起来像这样&lt;Details /&gt;
  • 我完全同意这是指向新问题link的链接
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多