Sql server 查找/替换SQL列中的行
我有一个HTML字段,其中包含从word文档中提取的整个网页的HTML 此HTML中可以包含以下内容:Sql server 查找/替换SQL列中的行,sql-server,tsql,Sql Server,Tsql,我有一个HTML字段,其中包含从word文档中提取的整个网页的HTML 此HTML中可以包含以下内容: <p>Please refer to <|Any combination of words|> policy.</p> 它将用以下名称替换“特定政策名称”: SQL是否可以做到这一点?尝试以下解决方案: SET NOCOUNT ON; DECLARE @MyTable TABLE ( ID INT IDENTITY(1,1) PR
<p>Please refer to <|Any combination of words|> policy.</p>
它将用以下名称替换“特定政策名称”:
SQL是否可以做到这一点?尝试以下解决方案:
SET NOCOUNT ON;
DECLARE @MyTable TABLE
(
ID INT IDENTITY(1,1) PRIMARY KEY,
OldContent NVARCHAR(MAX) NOT NULL,
NewContent NVARCHAR(MAX) NULL
);
INSERT INTO @MyTable (OldContent)
VALUES (N'<p>Please refer to <|Specific Policy Name<| policy.</p>');
WITH UpdateCTE
AS
(
SELECT b.NewContent,STUFF(b.InnerText,b.StartIndex-5,b.EndIndex-b.StartIndex+10,'<a href="'+b.[Text]+'">'+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
FROM @MyTable t
) a
) b
)
UPDATE UpdateCTE
SET NewContent = ChangedText;
SELECT *
FROM @MyTable x;
结果:
ID OldContent NewContent
--- ------------------------------------------------------------- ------------------------------------------------------------------------------------
1 <p>Please refer to <|Specific Policy Name<| policy.</p> <p>Please refer to <a href="Specific Policy Name">Specific Policy Name</a> policy.</p>
所以整个页面存储在表的一行中?是否必须使用SQL完成?没有什么是你不能做的,但这并不意味着你应该这样做。至少查看CLR并尝试在.NET中创建tsql可以访问的函数。@Elias word文档的HTML在“是”列中。@JeffO SQL最好是一次性的。只是基本上修复了一个未命中的通信。@Jeff如果在SQL中不可能,我也可以使用LINQ。对于测试,您可以使用SELECT*FROM UpdateCTE,而不是UPDATE UpdateCTE SET NewContent=ChangedText;。不要忘记使用事务开始事务。。。执行UPDATE语句时提交/回滚。我试图使其正常工作,但遇到错误。我更改了值,从文档中选择Top1 html,将整个html转换为Oldcontent。它抛出此错误消息536,级别16,状态5,第12行传递给子字符串函数的长度参数无效。@JamesWilson:尝试将PATINDEX“%”policy.%”替换为PATINDEX“%”policy%。@JamesWilson:正如您所见,此解决方案是有效的。如果您有问题,那么您应该找到那些抛出错误的行,并将这些值发布到HTML。我能够找到问题,它确实有效。而且速度非常快
SET NOCOUNT ON;
DECLARE @MyTable TABLE
(
ID INT IDENTITY(1,1) PRIMARY KEY,
OldContent NVARCHAR(MAX) NOT NULL,
NewContent NVARCHAR(MAX) NULL
);
INSERT INTO @MyTable (OldContent)
VALUES (N'<p>Please refer to <|Specific Policy Name<| policy.</p>');
WITH UpdateCTE
AS
(
SELECT b.NewContent,STUFF(b.InnerText,b.StartIndex-5,b.EndIndex-b.StartIndex+10,'<a href="'+b.[Text]+'">'+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
FROM @MyTable t
) a
) b
)
UPDATE UpdateCTE
SET NewContent = ChangedText;
SELECT *
FROM @MyTable x;
ID OldContent NewContent
--- ------------------------------------------------------------- ------------------------------------------------------------------------------------
1 <p>Please refer to <|Specific Policy Name<| policy.</p> <p>Please refer to <a href="Specific Policy Name">Specific Policy Name</a> policy.</p>