SQL Server更改html字符串中的字体
我有一个字符串存储在我的数据库中,格式为html,用户可以更改字体大小。那很好,但我需要做一份报告,字体大小都必须相同。因此,如果我有以下html,我想将其修改为字体大小为10:SQL Server更改html字符串中的字体,html,sql-server,sql-server-2008,user-defined-functions,Html,Sql Server,Sql Server 2008,User Defined Functions,我有一个字符串存储在我的数据库中,格式为html,用户可以更改字体大小。那很好,但我需要做一份报告,字体大小都必须相同。因此,如果我有以下html,我想将其修改为字体大小为10: <HTML><BODY><DIV STYLE="text-align:Left;font-family:Tahoma;font-style:normal;font-weight:normal;font-size:11;color:#000000;"><DIV><DI
<HTML><BODY><DIV STYLE="text-align:Left;font-family:Tahoma;font-style:normal;font-weight:normal;font-size:11;color:#000000;"><DIV><DIV><P><SPAN>This is my text to display.</SPAN></P></DIV></DIV></DIV></BODY></HTML>
当然,如果我将字体大小作为参数发送会更好,这样我就可以将其更改为任何值
我如何修改它以更改任何字符串,使字体大小为10
DECLARE @HTML NVarChar(2000) = '
<HTML>
<BODY>
<DIV STYLE="text-align:Left;font-family:Tahoma;font-style:normal;font-weight:normal;font-size:11;color:#000000;">
<DIV>
<DIV>
<P><SPAN>This is my text to display.</SPAN></P>
</DIV>
</DIV>
</DIV>
</BODY>
</HTML>';
DECLARE @X XML = @HTML;
WITH T AS (
SELECT C.value('.', 'VarChar(1000)') StyleAttribute
FROM @X.nodes('//@STYLE') D(C)
)
SELECT *
FROM T
WHERE T.StyleAttribute LIKE '%font-size:%';
从这里开始,我将使用CLR函数拆分;上的StyleAttribute列;。然后查找以字体大小开头的片段,并在上再次拆分。TryParse该结果的第二个元素,如果不是10,则替换它。然后构建字符串以获得StyleAttribute应该具有的值。从那里,您可以执行替换,从上表中查找原始值并替换CLR函数的输出
糟糕的问题…祝你好运
从这里开始,我将使用CLR函数拆分;上的StyleAttribute列;。然后查找以字体大小开头的片段,并在上再次拆分。TryParse该结果的第二个元素,如果不是10,则替换它。然后构建字符串以获得StyleAttribute应该具有的值。从那里,您可以执行替换,从上表中查找原始值并替换CLR函数的输出
糟糕的问题…祝你好运。正如Yuck所说,SQL Server字符串功能非常有限。您最终会遇到一堵墙,在那里,您最好的选择是求助于非SQL解决方案
如果您确实需要存储具有嵌入式样式的HTML,那么您还可以灵活修改数据模型,您可能需要考虑将第二个数据库列添加到表中。第二列将存储HTML的无样式版本。您可以在应用程序层解析样式。这将使查看未来报告和其他场景中的内容变得更加容易
正如Yuck所说,SQL Server字符串功能非常有限。您最终会遇到一堵墙,在那里,您最好的选择是求助于非SQL解决方案如果您确实需要存储具有嵌入式样式的HTML,那么您还可以灵活修改数据模型,您可能需要考虑将第二个数据库列添加到表中。第二列将存储HTML的无样式版本。您可以在应用程序层解析样式。这将使查看未来报告和其他场景中的内容变得更加容易
这似乎有效,尽管我只在一个字符串上尝试过,该字符串的字体设置为两处。我从剥离所有html的代码开始,并将其修改为只查找和更改“字体大小:”。我怀疑如果字体大小为9个或更少1个字符,并且我将其更改为10个2个字符,那么可能会出现问题,但它似乎也适用于此ALTER FUNCTION [dbo].[udf_ChangeFont]
(@HTMLText VARCHAR(MAX), @FontSize VARCHAR(2))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
SET @Start = CHARINDEX('font-size:',@HTMLText)
SET @End = CHARINDEX(';',@HTMLText,CHARINDEX('font-size:',@HTMLText))
SET @Length = (@End - @Start) + 1
WHILE @Start > 0
AND @End > 0
AND @Length > 0
BEGIN
SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'font-size:' + @FontSize + ';')
SET @Start = CHARINDEX('font-size:',@HTMLText, @End+2)
SET @End = CHARINDEX(';',@HTMLText,CHARINDEX('font-size:',@HTMLText, @End+2))
SET @Length = (@End - @Start) + 1
END
RETURN LTRIM(RTRIM(@HTMLText))
END
这似乎是可行的,尽管我只在一个字符串上尝试过,该字符串的字体设置在两个位置。我从剥离所有html的代码开始,并将其修改为只查找和更改“字体大小:”。我怀疑如果字体大小为9个或更少1个字符,并且我将其更改为10个2个字符,那么可能会出现问题,但它似乎也适用于此
ALTER FUNCTION [dbo].[udf_ChangeFont]
(@HTMLText VARCHAR(MAX), @FontSize VARCHAR(2))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
SET @Start = CHARINDEX('font-size:',@HTMLText)
SET @End = CHARINDEX(';',@HTMLText,CHARINDEX('font-size:',@HTMLText))
SET @Length = (@End - @Start) + 1
WHILE @Start > 0
AND @End > 0
AND @Length > 0
BEGIN
SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'font-size:' + @FontSize + ';')
SET @Start = CHARINDEX('font-size:',@HTMLText, @End+2)
SET @End = CHARINDEX(';',@HTMLText,CHARINDEX('font-size:',@HTMLText, @End+2))
SET @Length = (@End - @Start) + 1
END
RETURN LTRIM(RTRIM(@HTMLText))
END
您是否考虑过使用CSS类并将表示格式保存在外部CSS文件中?这里的任何解决方案都会遇到困难,因为T-SQL不擅长字符串解析。我的建议是编写一个CLR函数,这样就可以利用.NET字符串库。我会发布我到目前为止的想法,这是不多的。报告是在Crystal Reports中完成的,他们主要需要html格式。我无法控制数据的存储方式。我添加了代码作为一个似乎有效的答案,但在得到一些代码审查之前,我不想接受我自己的答案。我不知道我还没有遇到什么问题。您是否考虑过使用CSS类并将表示格式保存在外部CSS文件中?这里的任何解决方案都会遇到困难,因为t-SQL不擅长字符串解析。我的建议是编写一个CLR函数,这样就可以利用.NET字符串库。我会发布我到目前为止的想法,这是不多的。报告是在Crystal Reports中完成的,他们主要需要html格式。我无法控制数据的存储方式。我添加了代码作为一个似乎有效的答案,但在得到一些代码审查之前,我不想接受我自己的答案。我不知道我还没有遇到什么问题。