现在我正在运行查询,以查找文档中的动态字并将其替换为链接。它工作得很好但是当有一些特殊字符时会返回null
。目前,我遇到动态字包含ampersand '&'
以下是内容的一部分:
<p>STEPS:</p>
<p>
<p>Please refer to <|Cease & Desist|> policy.</p>
它为NULL
'Cease & Desist'
下面是我正在使用的代码,我需要的是它返回整个动态字,即使它包含&符号。
SET NOCOUNT ON;
DECLARE @MyTable TABLE
(
ID INT IDENTITY(1,1) PRIMARY KEY,
PolicyName NVARCHAR(200) NULL,
DocumentID int not null,
OldContent NVARCHAR(MAX) NOT NULL,
NewContent NVARCHAR(MAX) NULL
);
INSERT INTO @MyTable (documentid,OldContent)
select documentid, html from IPACS_Document where PATINDEX('%Please refer to <|%', html) > 0 and PATINDEX('%|> Policy%', html) > 0 and documentid = 147;
--select html, PATINDEX('%Please refer to <|%', html), PATINDEX('%|> Policy%', html) from IPACS_Document where PATINDEX('%Please refer to <|%', html) > 0;
WITH UpdateCTE
AS
(
SELECT b.PolicyName, b.[text], b.NewContent,STUFF(b.InnerText,b.StartIndex-5,b.EndIndex-b.StartIndex+10,'<a href="~/Document/Details/'+ CAST(d.[documentid] as VARCHAR(200))+'">'+b.[Text]+'</a>') AS ChangedText
FROM
(
SELECT a.*,SUBSTRING(a.InnerText,a.StartIndex,a.EndIndex-a.StartIndex) AS [Text]
FROM
(
SELECT PATINDEX('%Please refer to <|%',t.OldContent)+21 AS StartIndex,
PATINDEX('%|> Policy%',t.OldContent) AS EndIndex,
t.OldContent AS InnerText,
t.NewContent,
t.PolicyName
FROM @MyTable t
) a
) b
inner join IPACS_Document d on d.filename like '%' + b.[text] + '%'
where d.categoryid = 3
)
--select * from UpdateCTE
UPDATE UpdateCTE
SET NewContent = ChangedText, PolicyName = [text];
SELECT *
FROM @MyTable x;
在上面的查询中,最内部的查询query 'a'
InnerText column name [text]
包含动态字。这将作为table 'b'
传递给[text]
。最终在@Mytable
中,动态字汇入PolicyName
。
当动态词包含&符号或特殊字符时,如何才允许此操作?
答案 0 :(得分:1)
SET NOCOUNT ON;
DECLARE @MyTable TABLE
(
ID INT IDENTITY(1,1) PRIMARY KEY,
PolicyName NVARCHAR(200) NULL,
DocumentID int not null,
OldContent NVARCHAR(MAX) NOT NULL,
NewContent NVARCHAR(MAX) NULL
);
INSERT INTO @MyTable (PolicyName,OldContent,DocumentID)
VALUES (NULL,N'<p>STEPS:</p>
<p>
<p>Please refer to <|Cease & Desist|> policy.</p>',123);
;WITH UpdateCTE
AS
(
SELECT b.PolicyName, b.[text], b.NewContent,STUFF(b.InnerText,b.StartIndex-5,b.EndIndex-b.StartIndex+10,'<a href="~/Document/Details/'+ CAST(b.[documentid] as VARCHAR(200))+'">'+b.[Text]+'</a>') AS ChangedText
FROM
(
SELECT a.*,SUBSTRING(a.InnerText,a.StartIndex,a.EndIndex-a.StartIndex) AS [Text]
FROM
(
SELECT PATINDEX('%Please refer to <|%',t.OldContent)+21 AS StartIndex,
PATINDEX('%|> Policy%',t.OldContent) AS EndIndex,
t.OldContent AS InnerText,
t.NewContent,
t.PolicyName,
t.DocumentID
FROM @MyTable t
) a
) b
--inner join IPACS_Document d on d.filename like '%' + b.[text] + '%'
--where d.categoryid = 3
)
--select * from UpdateCTE
UPDATE UpdateCTE
SET NewContent = ChangedText, PolicyName = [text];
SELECT * FROM @MyTable x;
结果:
ID PolicyName DocumentID OldContent NewContent
-- ------------------- ----------- ----------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 Cease & Desist 123 <p>STEPS:</p> <p> <p>Please refer to <|Cease & Desist|> policy.</p> <p>STEPS:</p> <p> <p>Please refer to <a href="~/Document/Details/123">Cease & Desist</a> policy.</p>
答案 1 :(得分:0)
我认为您的问题可能是,不确定将看似是html元素的内容转换为表并使用表变量veruss永久或临时表(#temp)。我可以得到子字符串评估索引并将它们传递给临时表就好了,我不能使用表变量。这是使用SQL 2012作为我的版本。
使用子字符串也存在潜在问题,即您对正确格式化的XHTML进行零验证。在将xhtml转换为xml之后,我个人会使用xml查询和/或值解析。然而,这将显示最终出现的值,而不是您想要的值。但是我已经给出了你的子串方法,如果你希望数据保持标记,它仍然可以工作。自解压示例如下:
declare @X varchar(256) = ' <p>STEPS:</p>
<p>
<p>Please refer to <|Cease & Desist|> policy.</p>
<p>Just extra stuff ;lkasdlkjasdlfkjasdf;lasdjfl;asdjf;lsadjkf;dsaljfas;dljfsdalfjsadlkfjasd;lfk</p>
</p>'
if object_id('tempdb..#Temp') is not null
drop table #temp
;
With a as
(
Select
@X as AsIS
, cast(@X as varchar(128)) as Truncated
, PATINDEX('%Please refer to <|%', @X)+21 AS St
, PATINDEX('%|> Policy%', @X) as Ed
--, cast( cast(@X as varchar(128)) as xml) -- WILL BREAK ELEMENTS
, cast(@X as xml) as AsXml
)
Select
Substring(AsIs, St, Ed - St) as SubStringMethod
, AsXml.query('p/p').value('p[1]/.', 'varchar(256)') as xmlqueryvalue
into #temp
from a
declare @temp table ( submethod varchar(256), xmlmethod xml)
;
--insert into @temp -- WILL BLOW UP with
--XML parsing: line 1, character 18, illegal qualified name character
Select *
from #temp