Sql server 查找/替换SQL列中的行

Sql server 查找/替换SQL列中的行,sql-server,tsql,Sql Server,Tsql,我有一个HTML字段,其中包含从word文档中提取的整个网页的HTML 此HTML中可以包含以下内容: <p>Please refer to &lt;|Any combination of words|&gt; policy.</p> 它将用以下名称替换“特定政策名称”: SQL是否可以做到这一点?尝试以下解决方案: SET NOCOUNT ON; DECLARE @MyTable TABLE ( ID INT IDENTITY(1,1) PR

我有一个HTML字段,其中包含从word文档中提取的整个网页的HTML

此HTML中可以包含以下内容:

<p>Please refer to &lt;|Any combination of words|&gt; 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 &lt;|Specific Policy Name&lt;| 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 &lt;|%',t.OldContent)+21 AS StartIndex,
                    PATINDEX('%&lt;| 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 &lt;|Specific Policy Name&lt;| 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 &lt;|Specific Policy Name&lt;| 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 &lt;|%',t.OldContent)+21 AS StartIndex,
                    PATINDEX('%&lt;| 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 &lt;|Specific Policy Name&lt;| policy.</p> <p>Please refer to <a href="Specific Policy Name">Specific Policy Name</a> policy.</p>