将查询导出到 html table 时浮点值格式错误
Getting bad format on float values when exporting query to html table
我需要一些帮助。我使用此代码将 SQL 查询导出到 html tables(从 Convert a SQL query result table to an HTML table for email 获得代码)
-- 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'', @html=@html 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', @html=@html OUTPUT
END
GO
该代码运行完美,但在格式化浮点值时存在一个问题。
例如:
SELECT Name, Weight FROM Products
从 Management Studio 执行时,查询 returns 类似这样:
Name1 | 1073,822
Name2 | 179,554
当我使用存储过程将其导出到 html table 时,我得到的结果如下:
Name1 | 1.073822000000000e+003
Name2 | 1.795540000000000e+002
不确切知道如何更改存储过程以使其适应以避免这种浮点值格式错误。
如有任何帮助,我们将不胜感激。
您正在使用转换来显示 html-table 中的值:
SET @cols = ''SET @html = CAST(( SELECT '' + @cols + '' FROM #dynSql ' + @orderBy + ' FOR XML PATH(''''tr''''), ELEMENTS XSINIL) AS nvarchar(max))''
MS-Help 告诉你更多,但基本上这是使用浮点值进行转换的自动行为。
您应该尝试使用 STR()
函数将浮动字段转换为您传递的查询中所需的格式,请参阅 str function description
非常感谢您的回复
编辑:如果我去掉对 varchar(max) 的转换,结果似乎是一样的。
但我只是尝试做这样的事情:
SELECT Name, CAST(Weight AS varchar(max)) FROM Products
而且我仍然可以看到正确的格式化值:
Name1 | 1073.82
Name2 | 179.554
否则,我使用这个 SP 从许多站点和进程中调用。不可能检查每种情况并尝试转换浮动字段。
我需要一个在 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 转换为 float 时出错。
不知道你说的是不是这个。
是否可以检查 SP 中的字段类型,并对浮点数情况使用不同的转换?
我该怎么做?
此致,
我需要一些帮助。我使用此代码将 SQL 查询导出到 html tables(从 Convert a SQL query result table to an HTML table for email 获得代码)
-- 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'', @html=@html 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', @html=@html OUTPUT
END
GO
该代码运行完美,但在格式化浮点值时存在一个问题。 例如:
SELECT Name, Weight FROM Products
从 Management Studio 执行时,查询 returns 类似这样:
Name1 | 1073,822
Name2 | 179,554
当我使用存储过程将其导出到 html table 时,我得到的结果如下:
Name1 | 1.073822000000000e+003
Name2 | 1.795540000000000e+002
不确切知道如何更改存储过程以使其适应以避免这种浮点值格式错误。
如有任何帮助,我们将不胜感激。
您正在使用转换来显示 html-table 中的值:
SET @cols = ''SET @html = CAST(( SELECT '' + @cols + '' FROM #dynSql ' + @orderBy + ' FOR XML PATH(''''tr''''), ELEMENTS XSINIL) AS nvarchar(max))''
MS-Help 告诉你更多,但基本上这是使用浮点值进行转换的自动行为。
您应该尝试使用 STR()
函数将浮动字段转换为您传递的查询中所需的格式,请参阅 str function description
非常感谢您的回复
编辑:如果我去掉对 varchar(max) 的转换,结果似乎是一样的。
但我只是尝试做这样的事情:
SELECT Name, CAST(Weight AS varchar(max)) FROM Products
而且我仍然可以看到正确的格式化值:
Name1 | 1073.82
Name2 | 179.554
否则,我使用这个 SP 从许多站点和进程中调用。不可能检查每种情况并尝试转换浮动字段。 我需要一个在 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 转换为 float 时出错。 不知道你说的是不是这个。
是否可以检查 SP 中的字段类型,并对浮点数情况使用不同的转换?
我该怎么做?
此致,