我有以下SQL查询,它在表中显示多个XML节点并显示:
SELECT
PhysicianName = XC.value('(name)[1]', 'varchar(50)'),
Gender = XC.value('(gender)[1]', 'varchar(50)'),
LangSpoken = XLang.value('.', 'varchar(20)'),
InsAccepted = XIns.value('.', 'varchar(50)')
FROM
[MYDB].[dbo].[content]
CROSS APPLY
CAST([content_html] AS XML).nodes('/root/Physicians') AS XT(XC)
CROSS APPLY
XC.nodes('langAccept') AS XT2(XLang)
CROSS APPLY
XC.nodes('insAccept') AS XT3(XIns)
我必须将content_html
作为XML进行CAST,因为它是ntext
格式。我收到以下错误:
第15行,第15行,第1行,第9行 关键字“AS”附近的语法不正确
如何解决错误
答案 0 :(得分:2)
1)短期内,您可以替换
FROM
[MYDB].[dbo].[content]
CROSS APPLY
CAST([content_html] AS XML).nodes('/root/Physicians') AS XT(XC)
与
FROM (
SELECT CAST(content_html AS XML) AS content_xml
FROM [MYDB].[dbo].[content] AS c
) AS x
CROSS APPLY x.content_xml.nodes('/root/Physicians') AS XT(XC)
2)或者您可以更改列content_html
怎么样?
CREATE TABLE dbo.MyTable (content_html NTEXT)
INSERT dbo.MyTable VALUES (N'<a>text</a>')
GO
ALTER TABLE dbo.MyTable ADD content_xml XML
GO
UPDATE dbo.MyTable SET content_xml = CONVERT(XML, content_html)
-- ALTER TABLE dbo.MyTable ADD content_xml XML NOT NULL -- Is mandatory column ?
GO
ALTER TABLE dbo.MyTable DROP COLUMN content_html;
EXEC sp_rename 'dbo.MyTable.content_xml', 'content_html', 'COLUMN'
GO
SELECT * FROM dbo.MyTable
或者
3)你可以添加一个持久的计算列
ALTER TABLE dbo.content
ADD content_xml AS ( CAST(content_html AS XML) ) PERSISTED
在最后一种情况下,缺点是存储与XML相同的数据所需的额外存储空间。
4)警告:如果同一位医生有2个或更多LangSpoken以及两个或更多InsAccepted,那么结果集将为每个人包含这些值的交叉连接。