2017-07-11 2 views
0

私はこれに関する助けが必要です。 は私がクエリをhtmlテーブルにエクスポートするときの浮動小数点値のフォーマットが正しくない

-- Description: Turns a query into a formatted HTML table. Useful for emails. 
-- Any ORDER BY clause needs to be passed in the separate ORDER BY parameter. 
-- ============================================= 
CREATE PROC [dbo].[spQueryToHtmlTable] 
(
    @query nvarchar(MAX), --A query to turn into HTML format. It should not include an ORDER BY clause. 
    @orderBy nvarchar(MAX) = NULL, --An optional ORDER BY clause. It should contain the words 'ORDER BY'. 
    @html nvarchar(MAX) = NULL OUTPUT --The HTML output of the procedure. 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF @orderBy IS NULL BEGIN 
    SET @orderBy = '' 
    END 

    SET @orderBy = REPLACE(@orderBy, '''', ''''''); 

    DECLARE @realQuery nvarchar(MAX) = ' 
    DECLARE @headerRow nvarchar(MAX); 
    DECLARE @cols nvarchar(MAX);  

    SELECT * INTO #dynSql FROM (' + @query + ') sub; 

    SELECT @cols = COALESCE(@cols + '', '''''''', '', '''') + ''['' + name + ''] AS ''''td'''''' 
    FROM tempdb.sys.columns 
    WHERE object_id = object_id(''tempdb..#dynSql'') 
    ORDER BY column_id; 

    SET @cols = ''SET @html = CAST((SELECT '' + @cols + '' FROM #dynSql ' + @orderBy + ' FOR XML PATH(''''tr''''), ELEMENTS XSINIL) AS nvarchar(max))''  

    EXEC sys.sp_executesql @cols, N''@html nvarchar(MAX) OUTPUT'', @[email protected] OUTPUT 

    SELECT @headerRow = COALESCE(@headerRow + '''', '''') + ''<th>'' + name + ''</th>'' 
    FROM tempdb.sys.columns 
    WHERE object_id = object_id(''tempdb..#dynSql'') 
    ORDER BY column_id; 

    SET @headerRow = ''<tr>'' + @headerRow + ''</tr>''; 

    SET @html = ''<table border="1">'' + @headerRow + @html + ''</table>'';  
    '; 

    EXEC sys.sp_executesql @realQuery, N'@html nvarchar(MAX) OUTPUT', @[email protected] OUTPUT 
END 
GO 

Convert a SQL query result table to an HTML table for emailからコードを得た)HTMLテーブルにSQL queresをエクスポートするには、このコードを使用したコードは完璧に動作しますが、浮動小数点値をフォーマットする一つの問題があります。 例えば:

SELECT名前、体重製品

管理Studioから実行時にクエリは、このようなものを返すFROM:

Name1 | 1073,822 
Name2 | 179,554 

私はHTMLテーブルにこれをエクスポートするストアドプロシージャを使用すると、

Name1 | 1.073822000000000e+003 
Name2 | 1.795540000000000e+002 

ストアドプロシージャを順番に変更する方法がわからないのですがfloat値のこの誤った書式設定を避けるためです。

これについての助けに感謝します。あなたは、HTMLテーブルの値を表示するには、キャストを使用している

答えて

0

SET @cols = ''SET @html = CAST((SELECT '' + @cols + '' FROM #dynSql ' + @orderBy + ' FOR XML PATH(''''tr''''), ELEMENTS XSINIL) AS nvarchar(max))'' 

MS-Helpは、より多くのあなたに伝えますが、基本的にこれはfloat値とキャストの自動動作です。

、お返事

EDITためstr function description

0

感謝を参照してくださいあなたはSTR()機能を使用して、すでにあなたが渡すクエリで目的の形式にフロートフィールドを変換しようとする必要があります:私が取る場合varchar(max)にキャストすると、結果は同じように見えます。

しかし、私はちょうどこのような何かしようとしました:

SELECT Name, CAST(Weight AS varchar(max)) FROM Products 

をそして、私はまだ右の書式設定の値を参照することができます:私はから呼ばれるように、このSPを使用し、それ以外の場合は

Name1 | 1073.82 
Name2 | 179.554 

を多くのサイトとプロセス。すべてのケースをチェックしてフロートフィールドをキャストしようとすることはできません。 SPレベルで実装するソリューションが必要です。 私はラインを変更し、STR()関数を使用しようとしました:

SET @cols = ''SET @html = CAST((SELECT '' + @cols + '' FROM #dynSql ' + @orderBy + ' FOR XML PATH(''''tr''''), ELEMENTS XSINIL) AS nvarchar(max))'' 

SET @cols = ''SET @html = STR((SELECT '' + @cols + '' FROM #dynSql ' + @orderBy + ' FOR XML PATH(''''tr''''), ELEMENTS XSINIL))'' 

へしかし、その後、私はエラーを取得しています。エラーは、データ型はnvarcharをフローティングに変換します。 これがあなたが言及したものかどうかは不明です。

SPのフィールドタイプをチェックし、フロートケースに別のキャスティングを使用する方法はありますか?

どうすればいいですか?

よろしく、

+0

[編集]ボタンを使用して質問に追加情報を追加する必要があります。回答ボックスは、質問に対する回答としてのみ使用し、それ以上の質問には使用しないでください。 –

関連する問題