在CTE内更换

时间:2015-05-28 17:20:35

标签: sql sql-server xml replace common-table-expression

我有一个XML字段,我需要删除一个流氓rode。 那个流氓节点是

char[]

如何在标记的行上处理CTEScreenXML.ScreenXML字段以进行替换?

此CTE将有大约300行,因此替换需要在所有300行上工作。

2 个答案:

答案 0 :(得分:0)

您需要为CTE中的格式化或更改列提供别名。试试这个:

With CTEScreenXML (Code, CreatedOn, ScreenXML) AS
(
    SELECT GXML.Code, GXML.CreatedOn, CONVERT(NVARCHAR(MAX),GXML.ScreenXML) [ScreenXML]
    From dbo.GenScreenXML GXML
    WHERE CHARINDEX('<PROMPT><span/></PROMPT>',CONVERT(NVARCHAR(MAX),GXML.ScreenXML))>0
)
SELECT REPLACE(ScreenXML, '<PROMPT><span/></PROMPT>', '')) --THIS LINE
FROM dbo.CTEScreenXML

OR

SELECT GXML.Code, GXML.CreatedOn, REPLACE(CONVERT(NVARCHAR(MAX),GXML.ScreenXML), '<PROMPT><span/></PROMPT>', '') [ScreenXML]
FROM dbo.GenScreenXML GXML
WHERE CHARINDEX('<PROMPT><span/></PROMPT>',CONVERT(NVARCHAR(MAX),GXML.ScreenXML))>0ONVERT(NVARCHAR(MAX),GXML.ScreenXML))>0

答案 1 :(得分:0)

如果 ScreenXML 是XML列类型,我建议查询要删除的节点和delete它,而不是将其转换为NVARCHAR并比较字符串。

例如:

DECLARE @myDoc xml   
SET @myDoc = SELECT CTEScreenXML.ScreenXML FROM CTEScreenXML
SET @myDoc.modify('delete //Prompt/')
设置后的

:@myDoc将包含没有任何提示元素的原始XML。

有关更多示例,请阅读XQuery表达式。