2017-04-26 31 views
0

有一天我在symantec link這個symantec link中發現了一個很好的存儲過程,它將TSQL表的結果轉換爲HTML表。沒有任何CSS參數,結果效果很好。我傾向於用SQL服務器結果發送大量電子郵件,所以這非常有幫助。在此存儲過程中添加表格樣式?

現在,我已經能夠使它工作了,我正試圖在桌子上添加一些樣式。問題是我不知道如何發送CSS class作爲參數。

例如,這裏就是我應該叫SP:

EXEC dbo.CustomTable2HTMLv3 'Buffy',@HTML1 OUTPUT,'class="horizontal"',0 

的問題是,我不知道在哪裏的CSS classhorizontal從何而來。在鏈接中,我可以看到實際的CSS,但存儲過程如何讀取此內容?

的CSS是這樣的:

table.horizontal tr:first-child { 
background-color: Gray!important; 
font-weight: bold; 
color: #fff; 
} 

這是存儲過程:

CREATE PROCEDURE [dbo].[CustomTable2HTMLv3] ( 
@TABLENAME NVARCHAR(500), 
@OUTPUT NVARCHAR(MAX) OUTPUT, 
@TBL_STYLE NVARCHAR(1024) = '', 
@ALIGNMENT INT =0) 
AS 


-- Author:  Ian Atkin ([email protected]) 

-- Description 
--      Stored Procedure to take an arbitraty temporary table and return 
--      the equivalent HTML string . 

-- Version History 
--    1.0 - v1 Release For Symantec Connect 
--  3.0 - v3 Release for Symantec connect. 
--  Table to be outputed both horizonally and vertically. IsNull used 
--  on cell value output to prevent NULLs creaping into HTML string 


-- @exec_str stores the dynamic SQL Query 
-- @ParmDefinition stores the parameter definition for the dynamic SQL 
DECLARE @exec_str NVARCHAR(MAX) 
DECLARE @ParmDefinition NVARCHAR(500) 



IF @ALIGNMENT=0 
BEGIN 
--We need to use Dynamic SQL at this point so we can expand the input table name parameter 
SET @exec_str= N' 
DECLARE @exec_str NVARCHAR(MAX) 
DECLARE @ParmDefinition NVARCHAR(500) 
DECLARE @DEBUG INT 
SET @DEBUG=0 

IF @DEBUG=1 Print ''Table2HTML -Horizontal alignment'' 

--Make a copy of the original table adding an indexing column. We need to add an index column to the table to facilitate sorting so we can maintain the 
--original table order as we iterate through adding HTML tags to the table fields. 
--New column called CustColHTML_ID (unlikely to be used by someone else!) 
-- 

select CustColHTML_ID=0,* INTO #CustomTable2HTML FROM ' + @TABLENAME + ' 
IF @DEBUG=1 PRINT ''Created temporary custom table'' 

--Now alter the table to add the auto-incrementing index. This will facilitate row finding 
DECLARE @COUNTER INT 
SET @COUNTER=0 
UPDATE #CustomTable2HTML SET @COUNTER = [email protected]+1 
IF @DEBUG=1 PRINT ''Added counter column to custom table'' 

-- @HTMLROWS will store all the rows in HTML format 
-- @ROW will store each HTML row as fields on each row are iterated through 
-- using dymamic SQL and a cursor 
-- @FIELDS will store the header row for the HTML Table 

DECLARE @HTMLROWS NVARCHAR(MAX) DECLARE @FIELDS NVARCHAR(MAX) 
SET @HTMLROWS='''' DECLARE @ROW NVARCHAR(MAX) 

-- Create the first HTML row for the table (the table header). Ignore our indexing column! 

SELECT @FIELDS=COALESCE(@FIELDS, '' '','''')+''<td>'' + name + ''</td>'' 
FROM tempdb.sys.Columns 
WHERE object_id=object_id(''tempdb..#CustomTable2HTML'') 
AND name not like ''CustColHTML_ID'' 
SET @[email protected] + ''</tr>'' 
IF @DEBUG=1 PRINT ''table fields: '' + @FIELDS 


-- @ColumnName stores the column name as found by the table cursor 
-- @maxrows is a count of the rows in the table, and @rownum is for marking the 
-- ''current'' row whilst processing 

DECLARE @ColumnName NVARCHAR(500) 
DECLARE @maxrows INT 
DECLARE @rownum INT 


--Find row count of our temporary table 
SELECT @maxrows=count(*) FROM #CustomTable2HTML 


--Create a cursor which will look through all the column names specified in the temporary table 
--but exclude the index column we added (CustColHTML_ID) 
DECLARE col CURSOR FOR 
SELECT name FROM tempdb.sys.Columns 
WHERE object_id=object_id(''tempdb..#CustomTable2HTML'') 
AND name not like ''CustColHTML_ID'' 
ORDER BY column_id ASC 

--For each row, generate dymanic SQL which requests the each column name in turn by 
--iterating through a cursor 
SET @rowNum=1 
SET @ParmDefinition=N''@ROWOUT NVARCHAR(MAX) OUTPUT,@rowNum_IN INT'' 

While @rowNum <= @maxrows 
BEGIN 
    SET @[email protected] + ''<tr>'' 
    OPEN col 
    FETCH NEXT FROM col INTO @ColumnName 
    IF @DEBUG=1 Print ''@ColumnName: '' + @ColumnName 
    WHILE @@FETCH_STATUS=0 
    BEGIN 
     --Get nth row from table 
     --SET @exec_str=''SELECT @ROWOUT=(select top 1 ['' + @ColumnName + ''] from (select top '' + cast(@rownum as varchar) + '' * from #CustomTable2HTML order by CustColHTML_ID ASC) xxx order by CustColHTML_ID DESC)'' 
     SET @exec_str=''SELECT @ROWOUT=(select ['' + @ColumnName + ''] from #CustomTable2HTML where [email protected]_IN)'' 
     IF @DEBUG=1 PRINT ''@exec_str: '' + @exec_str  
    EXEC  sp_executesql 
        @exec_str, 
        @ParmDefinition, 
        @[email protected] OUTPUT, 
      @[email protected] 

     IF @DEBUG=1 SELECT @ROW as ''@Row'' 

     SET @HTMLROWS [email protected] + ''<td>'' + IsNull(@ROW,'''') + ''</td>'' 
     FETCH NEXT FROM col INTO @ColumnName 
    END 
    CLOSE col 
    SET @[email protected] +1 
    SET @[email protected] + ''</tr>'' 
END 

SET @OUTPUT='''' 
IF @maxrows>0 
SET @OUTPUT= ''<table ' + @TBL_STYLE + '>'' + @FIELDS + @HTMLROWS + ''</table>'' 

DEALLOCATE col 
' 
END 
ELSE 
BEGIN 
--This is the SQL String for table columns to be aligned on the vertical 
--So we select a table column, and then iterate through all the rows for that column, this forming 
--one row of our html table. 

SET @exec_str= N' 
DECLARE @exec_str NVARCHAR(MAX) 
DECLARE @ParmDefinition NVARCHAR(500) 
DECLARE @DEBUG INT 
SET @DEBUG=0 

IF @DEBUG=1 Print ''Table2HTML -Vertical alignment'' 

--Make a copy of the original table adding an indexing column. We need to add an index column to the table to facilitate sorting so we can maintain the 
--original table order as we iterate through adding HTML tags to the table fields. 
--New column called CustColHTML_ID (unlikely to be used by someone else!) 
-- 

select CustColHTML_ID=0,* INTO #CustomTable2HTML FROM ' + @TABLENAME + ' 

IF @DEBUG=1 PRINT ''CustomTable2HTMLv2: Modfied temporary table'' 

--Now alter the table to add the auto-incrementing index. This will facilitate row finding 
DECLARE @COUNTER INT 
SET @COUNTER=0 
UPDATE #CustomTable2HTML SET @COUNTER = [email protected]+1 

-- @HTMLROWS will store all the rows in HTML format 
-- @ROW will store each HTML row as fields on each row are iterated through 
-- using dymamic SQL and a cursor 

DECLARE @HTMLROWS NVARCHAR(MAX) 
DECLARE @ROW NVARCHAR(MAX) 

SET @HTMLROWS='''' 


-- @ColumnName stores the column name as found by the table cursor 
-- @maxrows is a count of the rows in the table 

DECLARE @ColumnName NVARCHAR(500) 
DECLARE @maxrows INT 

--Find row count of our temporary table 
--This is used here purely to see if we have any data to output 
SELECT @maxrows=count(*) FROM #CustomTable2HTML 

--Create a cursor which will iterate through all the column names in the temporary table 
--(excepting the one we added above) 

DECLARE col CURSOR FOR 
SELECT name FROM tempdb.sys.Columns 
WHERE object_id=object_id(''tempdb..#CustomTable2HTML'') 
AND name not like ''CustColHTML_ID'' 
ORDER BY column_id ASC 

--For each **HTML** row, we need to for each iterate through each table column as the outer loop. 
--Once the column name is identified, we use Coalesc to combine all the column values into a single string. 

SET @ParmDefinition=N''@COLOUT NVARCHAR(MAX) OUTPUT'' 

OPEN col 
FETCH NEXT FROM col INTO @ColumnName 
WHILE @@FETCH_STATUS=0 
    BEGIN 

    --Using current column name, grab all column values and combine into an HTML cell string using COALESCE 
    SET @ROW='''' 
    SET @exec_str='' SELECT @COLOUT=COALESCE(@COLOUT + ''''</td>'''','''''''') + ''''<td>'''' + Cast(IsNull(['' + @ColumnName + ''],'''''''') as nvarchar(max)) from #CustomTable2HTML '' 
    IF @DEBUG=1 PRINT ''@exec_str: '' + @exec_str 
    EXEC  sp_executesql 
      @exec_str, 
      @ParmDefinition, 
      @[email protected] OUTPUT 

    SET @HTMLROWS [email protected] + ''<tr>'' + ''<td>'' + @ColumnName + ''</td>'' + @ROW + ''</tr>'' 
    IF @DEBUG=1 SELECT @ROW as ''Current Row'' 
    IF @DEBUG=1 SELECT @HTMLROWS as ''HTML so far..'' 

    FETCH NEXT FROM col INTO @ColumnName 
    END 
CLOSE col 


SET @OUTPUT='''' 
IF @maxrows>0 
SET @OUTPUT= ''<table ' + @TBL_STYLE + '>'' + @HTMLROWS + ''</table>'' 

DEALLOCATE col 
' 
END 



DECLARE @ParamDefinition nvarchar(max) 
SET @ParamDefinition=N'@OUTPUT NVARCHAR(MAX) OUTPUT' 



--Execute Dynamic SQL. HTML table is stored in @OUTPUT which is passed back up (as it's 
--a parameter to this SP) 
EXEC sp_executesql @exec_str, 
@ParamDefinition, 
@[email protected] OUTPUT 

RETURN 1 
+0

當您從SSMS執行它時,它實際上是否添加了CSS樣式? 如果表格將水平或垂直打印,則這由@Alignment參數定義。我認爲CSS本身不會被應用,如果你沒有指定源代碼或鏈接內聯樣式表。 –

+0

不可以。它顯示純文本沒有顏色。格式是正確的,但沒有任何屬性可以給HTML任何樣式。 – rbhat

回答

1

因此,在link您提供有以下提示:

「爲了幫助你設計你的表格樣式,我也在 的壓縮包裏下載了一個HTML文件,它有一個n嵌入樣式表中的元素 「。

所以,如果你打開他們提到那裏的html file,你會看到他們已經宣佈html本身內部的風格。 你只能通過SQL創建表,如果你喜歡,附上類名傳遞它作爲參數,但你將需要生成一個完整的HTML文件包含CSS(或引用它,沒關係)在爲了讓你的桌子風格。

正如我在評論中提到的,如果表格將水平或垂直打印,則僅由@alignment屬性定義,而不是由CSS class定義。 (您可以在存儲過程代碼中看到這一點)

+0

我曾看過這個html文件,但它並沒有說我需要在文件中包含html以使其工作。 – rbhat

+0

那麼,存儲過程只是生成表。沒有其他的。它會根據您提供的@TBL_STYLE參數來創建它,或者使用定義的css類或不使用css類。因此,如果您需要它包含某種樣式,則需要在編寫此過程的人員執行此操作時,將您的表放入具有某種嵌入或引用樣式的HTML文件中。 您也可以修改該程序,以便爲您創建整個html,而不僅僅是

。 :) –

+0

考慮到在SP的第一個版本中,我可以包含實際的CSS作爲參數,我希望這個最後的版本會是類似的。不幸的是,事實並非如此。 – rbhat