Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server更改html字符串中的字体_Html_Sql Server_Sql Server 2008_User Defined Functions - Fatal编程技术网

SQL Server更改html字符串中的字体

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,用户可以更改字体大小。那很好,但我需要做一份报告,字体大小都必须相同。因此,如果我有以下html,我想将其修改为字体大小为10:

<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格式。我无法控制数据的存储方式。我添加了代码作为一个似乎有效的答案,但在得到一些代码审查之前,我不想接受我自己的答案。我不知道我还没有遇到什么问题。