Kim Torgersen


Temp-tabell till HTML-tabell

article feature image


Procedur som tar en temptabell och producerar en html-sträng med motsvarande tabell med innehåll.

CREATE PROCEDURE dbo.TemptabellTillHtmlTabell
    @Tabellnamn varchar(MAX),
    @HtmlTable  varchar(MAX) OUTPUT
AS
BEGIN

    DECLARE
        @Sql nvarchar(MAX),
        @HtmlHead varchar(MAX),
        @HtmlRowSql varchar(MAX),
        @ColumnIds varchar(MAX);

    WITH Col AS (
        SELECT
            C.column_id AS [ColumnId],
            C.name AS [ColumnName]
        FROM
            tempdb.sys.tables T
            JOIN tempdb.sys.columns C ON
                C.object_id = T.object_id
        WHERE
            T.name LIKE CONCAT('#', REPLACE(@Tabellnamn, '#', ''), '%')
    )
    SELECT
        @ColumnIds =
            STUFF(
                ((
                    SELECT CONCAT(', ', C.ColumnId)
                    FROM Col C
                    ORDER BY C.ColumnId
                    FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
                ),
                1,
                2,
                ''
            ),
        @HtmlHead =
            ((
                SELECT CONCAT('<th>', C.ColumnName, '</th>')
                FROM Col C
                ORDER BY C.ColumnId
                FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
            ),
        @HtmlRowSql =
            CONCAT(
                'CONCAT(',
                    '''<tr>'', ',
                    ((
                        SELECT CONCAT('''<td>'', T.', C.ColumnName, ', ''</td>'', ')
                        FROM Col C
                        ORDER BY C.ColumnId
                        FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
                    ),
                    '''</tr>''',
                ')'
            );

    SELECT
        @Sql = CONCAT(N'
            SELECT
                @HtmlTable =
                    CONCAT(
                        ''<table>'',
                            ''<thead>'',
                                ''<tr>',
                                    @HtmlHead,
                                '</tr>'',
                            ''</thead>'',
                            ''<tbody>'',
                        ((
                            SELECT
                                ', @HtmlRowSql, '
                            FROM
                                ', CONCAT('#', REPLACE(@Tabellnamn, '#', '')), ' T
                            ORDER BY
                                ', @ColumnIds, '
                            FOR XML PATH(''''), TYPE).value(''.'', ''varchar(max)'')
                        ),
                        ''</tbody>'',
                        ''</table>''
                    );');

    EXEC sys.sp_executesql
        @stmt = @Sql,
        @Params = N'@HtmlTable varchar(max) output',
        @HtmlTable = @HtmlTable OUTPUT;

END
GO