【问题标题】:Creating html content with SQL使用 SQL 创建 html 内容
【发布时间】:2020-07-10 19:25:53
【问题描述】:

我使用的是 Microsoft SQL Server 2016。我可以在其他版本中使用它。

我的表格中有一个 html 页面内容的变量。

SQL Server 表:

PageVariables
Menus
Slides etc.

我可以在不编程的情况下在 SQL Server 中生成页面 html 吗?

我尝试使用部分替换来做到这一点。但它不适用于多行表。我认为这也不是正确的方法。

在 JavaScript 中是否有类似 SQL Server 的东西,例如 mustache、vue、javascript 文字?

declare @template nvarchar(max)='<html><head>{title}</title></head><body><div class="menu">{menu}</div></body></html>'

declare @title  nvarchar(max)='My Page'
declare @menu  nvarchar(max)=''

SELECT 'My Menu-1' AS 'MenuName',
       '?link=1' AS 'MenuLink'
UNION ALL
SELECT 'My Menu-2' AS 'MenuName',
       '?link=2' AS 'MenuLink'

/*
for @menu
    set @menu='<a href="@MenuLink">@MenuName</a>'
next
*/
SET @template = REPLACE(@template, '{title}', @title)
SET @template = REPLACE(@template, '{menu}', @menu)

SELECT @template

这样也很难。

        SELECT '?link=1' AS '@href',
               'My Menu-1' AS 'span'

        UNION ALL
        SELECT '?link=2' AS '@href',
               'My Menu-2' AS 'span'

        FOR XML PATH ('a'), ROOT ('div')

【问题讨论】:

  • 一般来说,SQL 并不意味着生成用户界面。它用于在数据库中存储和检索数据。您可以执行某种级别的渲染,但您很快就会发现它不适合它。你需要一个应用层,尽管很简单。

标签: html sql sql-server templates generate


【解决方案1】:

这是可行的,但穿刺者是正确的,你可能会很快超越这种技术。

映射表可以根据需要包含任意数量的项目。即使是不需要的项目,它们也会被忽略。

这是一个简化的例子。

declare @template nvarchar(max)='
<html>
    <head>
        <title>{title}</title>
    </head>
    <body>
        <div class="welcome">{username}</div>
        <div class="menu">
            {menu}
        </div>
    </body>
</html>
'

Declare @map table (Seq int,Item varchar(100),Value varchar(max))
Insert Into @map values
 (1   ,'{title}','My Page')
,(2   ,'{username}','Mary-Jane')
,(9999,'{title}','')             -- clean-up
,(9999,'{username}','')          -- clean-up
,(9999,'{menu}','')              -- clean-up


-- Generate from select ... note the trailing {menu}
Insert Into @map values  
 (1  ,'{menu}','<a href="My Menu-1">?link=1</a>{menu}')
,(2  ,'{menu}','<a href="My Menu-2">?link=2</a>{menu}')



Select @template=replace(@template,Item,Value)
 From  @map
 Order By Seq

Print @template

退货

<html>
    <head>
        <title>My Page</title>
    </head>
    <body>
        <div class="welcome">Mary-Jane</div>
        <div class="menu">
            <a href="My Menu-1">?link=1</a><a href="My Menu-2">?link=2</a>
        </div>
    </body>
</html>

【讨论】:

  • 非常好,并展示了他如何构建表格以使他的网站由数据驱动,而不是在 SQL 中生成 HTML。此外,尝试将所有行和字符串合并在一起,等等。
  • @Pete-S- 非常友善。你是对的,我使用表格,但也有一些有趣的项目可以动态地取消透视记录(不是动态 sql),用于 FName、LName、EMail、日期字符串等项目。
【解决方案2】:

当您需要将多行合并为单个条目时,您想要做的是这些string concatenation operations 之一:

  1. 使用 FOR XML PATH 连接多行
  2. 使用 COALESCE 连接行
  3. 使用 STRING_AGG

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2012-08-30
    • 1970-01-01
    • 2023-03-08
    • 2023-03-22
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多