如何解决更新一个字符串中的多个子字符串
我在一个 sql 表中存储了一个文本字符串,其中包含以下所有文本。格式为 XML,但字段定义为 varchar。
<?xml version="1.0" encoding="utf-16"?>
<SaveFileContext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Mappings>
<SaveFileModel Header="Model1" FullPath="Model1" ViewType="ModelView" />
<SaveFileModel Header="xyz" FullPath="\\server\directory\" ViewType="TradeView" />
<SaveFileModel Header="Model2" FullPath="Model2" ViewType="ModelView" />
<SaveFileModel Header="Model3" FullPath="Model3" ViewType="ModelView" />
<SaveFileModel Header="abc" FullPath="\\server\directory\" ViewType="TradeView" />
<SaveFileModel Header="def" FullPath="\\server\directory\" ViewType="TradeView" />
<SaveFileModel Header="ghi" FullPath="\\server\directory\" ViewType="TradeView"/>
</Mappings>
</SaveFileContext>
如何更新或删除 viewtype="ModelView" 处的整行文本?
我想删除此单个字符串中 viewtype="ModelView" 的所有行,并将其替换为空格。在上面的示例中,我想总共删除 3 行并保留其余行。
最后,我希望字符串如下所示(请记住,所有行都包含在 1 个单独的字符串中。我只是将它们分开以方便查看。
<?xml version="1.0" encoding="utf-16"?>
<SaveFileContext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Mappings>
<SaveFileModel Header="xyz" FullPath="\\server\directory\" ViewType="TradeView" />
<SaveFileModel Header="abc" FullPath="\\server\directory\" ViewType="TradeView" />
<SaveFileModel Header="def" FullPath="\\server\directory\" ViewType="TradeView" />
<SaveFileModel Header="ghi" FullPath="\\server\directory\" ViewType="TradeView"/>
</Mappings>
</SaveFileContext>
这是我当前用来替换行的查询,但要替换的值非常具体。我基本上是输入要查找的字符串来替换。
IF OBJECT_ID('tempdb..#replacement') IS NOT NULL
DROP TABLE #replacement
CREATE TABLE #replacement (
string_pattern VARCHAR(100),string_replacement VARCHAR(5)
);
INSERT INTO #replacement (
string_pattern,string_replacement
)
VALUES
('<SaveFileModel Header="Model1" FullPath="Model1" ViewType="ModelView" />',''),('<SaveFileModel Header="Model2" FullPath="Model2" ViewType="ModelView" />',('<SaveFileModel Header="Model3" FullPath="Model3" ViewType="ModelView" />',('<SaveFileModel Header="Model4" FullPath="Model4" ViewType="ModelView" />',('<SaveFileModel Header="Model5" FullPath="Model5" ViewType="ModelView" />',('<SaveFileModel Header="Model6" FullPath="Model6" ViewType="ModelView" />',('<SaveFileModel Header="Model7" FullPath="Model7" ViewType="ModelView" />',('<SaveFileModel Header="Model8" FullPath="Model8" ViewType="ModelView" />',('<SaveFileModel Header="Model9" FullPath="Model9" ViewType="ModelView" />',('<SaveFileModel Header="Model10" FullPath="Model10" ViewType="ModelView" />',('<SaveFileModel Header="Model11" FullPath="Model11" ViewType="ModelView" />',('<SaveFileModel Header="Model12" FullPath="Model12" ViewType="ModelView" />',('<SaveFileModel Header="Model13" FullPath="Model13" ViewType="ModelView" />',('<SaveFileModel Header="Model14" FullPath="Model14" ViewType="ModelView" />',('<SaveFileModel Header="Model15" FullPath="Model15" ViewType="ModelView" />',('<SaveFileModel Header="Model16" FullPath="Model16" ViewType="ModelView" />',('<SaveFileModel Header="Model17" FullPath="Model17" ViewType="ModelView" />',('<SaveFileModel Header="Model18" FullPath="Model18" ViewType="ModelView" />',('<SaveFileModel Header="Model19" FullPath="Model19" ViewType="ModelView" />',('<SaveFileModel Header="Model20" FullPath="Model20" ViewType="ModelView" />','');
DECLARE @string AS VARCHAR(MAX),@userident varchar(20);
DECLARE userviewdef CURSOR FOR
SELECT
UserID
FROM
TableSettings where section = 'user view session'
OPEN userviewdef;
FETCH NEXT FROM userviewdef INTO
@userident;
WHILE @@FETCH_STATUS = 0
BEGIN
select @string = varcharvalue from tablesettings where section = 'user view session' and userid = @userident
-- Perform all replacements
SELECT @string = REPLACE(@string,string_pattern,string_replacement) FROM #replacement;
-- Return new string
--PRINT @string;
update tablesettings
set varcharvalue = @string
where section = 'user view session' and userid = @userident
FETCH NEXT FROM userviewdef INTO
@userident;
END;
CLOSE userviewdef;
DEALLOCATE userviewdef;
在某些情况下,字符串可能是下面看到的内容,并且不会被删除,因为它不适合我编码要删除的任何字符串。我想找到一种简单的方法来删除 ViewType="ModelView" 中的任何行,因为这是我的标准。
<SaveFileModel Header="ThisIsSomethingElse" FullPath="Model1" ViewType="ModelView" />
4/21/21: 在遵循@FrankPl 的建议使用 XML 之后,我想到了这里。结果返回一个空格。我可能对 XML 查询部分的编码有误,需要一些帮助:
DECLARE @stringXML XML,@finalString varchar(max),@userident varchar(20);
DECLARE userviewdef CURSOR FOR
SELECT
UserID
FROM
TableSettings where section = 'user view session';
OPEN userviewdef;
FETCH NEXT FROM userviewdef INTO
@userident;
WHILE @@FETCH_STATUS = 0
BEGIN
select @stringXML = varcharvalue from tablesettings where section = 'user view session' and userid = @userident
select @stringXML.query('
for $item in (/SaveFileContext/Mappings/SaveFileModel)
return if ($item[@ViewType = "ModelView"]) then string($item) else ""
')
select @finalString = convert(varchar(max),@stringXML)
-- Return new string
PRINT @finalstring;
FETCH NEXT FROM userviewdef INTO
@userident;
END;
CLOSE userviewdef;
DEALLOCATE userviewdef;
解决方法
如果您将 @step
变量声明为数据类型 XML
而不是 varchar
,您可以使用 XQuery 来处理数据,在这种情况下 a FLOWR expression文字 XML 元素,大括号从文字模式切换到 XPath 模式:
SELECT @string.query('
<SaveFileContext>
<Mappings> {
for $item in (/SaveFileContext/Mappings/SaveFileModel)
return if ($item[@ViewType = "ModelView"]) then $item else ()
} </Mappings>
</SaveFileContext>
'
XML 声明和命名空间被 SQLServer XML 处理器吞下。
此解决方案假定数据是有效的 XML 片段。
请注意 - 因为整个查询需要是一个 SQL 字符串(即单引号),并且 XQuery 接受双引号和单引号中的字符串,为简单起见,我在这里使用了双引号。或者,我可以使用双引号在 SQL 字符串中对它们进行转义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。