Я занят модификацией скрипта, который выводит данные из временной таблицы в скрипт, отправляемый нашим пользователям.Он отслеживает нашу статистику использования SQL и используется для отчетов и так далее.Я вывел временную таблицу перед кодом электронной почты, приведенным ниже, и он правильно поддерживает мой десятичный столбец как «12, 12345» или DECIMAL(18, 5)
.
Однако последний раздел, который отправляет электронное письмо (прилагается ниже), сохраняетпри отбрасывании моих десятичных знаков и вместо этого выдает «12 000».Кто-нибудь, возможно, поможет, пожалуйста, я пробовал различные кастинги в скрипте, заменяя "," на "."и наоборот.
SET @xml = CAST((SELECT
LEFT(UPPER([Server]), 20) AS 'td', '',
LEFT([Database], 30) AS 'td', '',
LEFT(Device, 30) AS 'td', '',
LEFT([GB_Growth], 20) AS 'td', '',
REPLACE(CAST([GB_Current] AS DECIMAL(18, 5)), '.', ',') AS 'td', '',
REPLACE(CAST([GB_Previous] AS DECIMAL(18, 5)), '.', ',') AS 'td', '',
ISNULL(CONVERT(CHAR(20),[Current_Date], 20), '--------------') AS 'td', '',
ISNULL(CONVERT(CHAR(20),[Previous_Date], 20), '--------------') AS 'td', ''
FROM
[tempdb].[dbo].[DB_Dev_Sizediff]
ORDER BY
[Server], [Database]
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX))
Я оставил свою попытку в приведенном выше скрипте (который не работает), но я ищу, чтобы это работало для следующих столбцов:
GB_Growth, GB_Current and GB_Previous
оригинальная функция в скрипте выполняла следующее, однако я пытался попробовать разные вещи, поэтому причина выше:
ISNULL(CONVERT(CHAR(23), [GB_Current]), '-----') AS 'td', ''
Опять все, что привело к этому пункту, в DECIMAL, и яподтвердили это право вплоть до этого шага.
Снимок экрана с выводом
![enter image description here](https://i.stack.imgur.com/5ABhP.png)
Полный сценарий:
--Temp Table
IF OBJECT_ID (N'tempdb.dbo.DB_Dev_Sizediff', N'U') IS NULL
CREATE TABLE [tempdb].[dbo].[DB_Dev_Sizediff] (
[Server] [sysname]
, [Database] [sysname]
, [Device] [sysname]
, [GB_Current] [decimal](18,5)
, [GB_Previous] [decimal](18,5)
, [GB_Growth] [decimal](18,5)
, [Current_Date] [datetime]
, [Previous_Date] [datetime]
)
ELSE TRUNCATE TABLE tempdb.dbo.DB_Dev_Sizediff ;
-- Temp Table 2
IF OBJECT_ID (N'dbo.dbspace', N'U') IS NULL
CREATE TABLE [dbo].[dbspace] (
[runid] [int]
, [date] [smalldatetime]
, [servername] [sysname]
, [dbname] [varchar](128)
, [devname] [sysname]
, [type] [char](10)
, [gb_alloc] [decimal](18,5)
, [gb_used] [decimal](18,5)
) ;
-- Get Latest Run From Run ID
WITH Current_Run AS
(
SELECT d.runid
, d.servername
, d.dbname
, d.devname
, d.gb_alloc
, d.gb_used
, d.[date]
FROM dbo.dbspace d
WHERE d.runid = (SELECT MAX(runid) FROM dbo.dbspace)
) ,
Previous_Run AS
(
SELECT d.runid
, d.servername
, d.dbname
, d.devname
, d.gb_alloc
, d.gb_used
, d.[date]
FROM dbo.dbspace d
WHERE d.runid = (SELECT MAX(runid) FROM dbo.dbspace WHERE runid < (SELECT MAX(runid) FROM dbo.dbspace))
)
INSERT INTO tempdb.dbo.DB_Dev_Sizediff
SELECT CASE WHEN cr.servername IS NOT NULL
THEN cr.servername
ELSE pr.servername
END AS 'Server'
, CASE WHEN cr.dbname IS NOT NULL
THEN cr.dbname
ELSE pr.dbname
END AS 'Database'
, CASE WHEN cr.devname IS NOT NULL
THEN cr.devname
ELSE pr.devname
END AS 'Device'
, CAST(cr.gb_alloc as DECIMAL (18, 5))
, CAST(pr.gb_alloc as DECIMAL (18, 5))
, CASE WHEN cr.gb_alloc IS NOT NULL
THEN cr.gb_alloc - ISNULL(pr.gb_alloc,0)
ELSE 0 - pr.gb_alloc
END AS 'GB_Growth'
, cr.[date]
, pr.[date]
FROM Current_Run cr
FULL OUTER JOIN Previous_Run pr
ON cr.servername = pr.servername
AND cr.dbname = pr.dbname
AND cr.devname = pr.devname
WHERE cr.gb_alloc = pr.gb_alloc
OR cr.gb_alloc IS NULL
OR pr.gb_alloc IS NULL
--If any changes, compile our email below
IF EXISTS (SELECT 1 FROM tempdb.dbo.DB_Dev_Sizediff)
BEGIN
DECLARE @subj VARCHAR(200)
, @body NVARCHAR(MAX)
, @xml NVARCHAR(MAX)
SELECT @subj = 'Database device size changes'
SET @body = '<html><body>
<p><font size="2" face="monaco">
Listed below are are all databases that have grown since our last scan. <BR><BR>
<H3>Database Device Size Changes in GB</H3>
<table border="1" cellpadding="5">
<p><font size="2" face="monaco">
<tr>
<th>Server</th> <th>Database</th> <th>Device</th> <th>GB Growth</th> <th>GB Current</th> <th>GB Previous</th> <th>Current Check</th> <th>Previous Check</th></tr>'
SET @xml = CAST(
(SELECT LEFT(UPPER([Server]),20) AS 'td',''
, LEFT([Database], 30) AS 'td',''
, LEFT(Device, 30) AS 'td',''
, [GB_Growth] AS 'td',''
, [GB_Current] AS 'td',''
, [GB_Previous] AS 'td',''
, ISNULL(CONVERT(CHAR(20),[Current_Date],20),'--------------') AS 'td',''
, ISNULL(CONVERT(CHAR(20),[Previous_Date],20),'--------------') AS 'td',''
FROM [tempdb].[dbo].[DB_Dev_Sizediff]
ORDER BY [Server], [Database]
FOR XML PATH('tr'), ELEMENTS )
AS NVARCHAR(MAX))
--Compile Email and Send It using Defined Settings
SET @body = @body + @xml +'</table></body></html>'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @profile_name
, @recipients = @recipients
, @subject = @subj
, @body = @body
, @body_format = 'HTML'
END
Источник - http://www.sqlservercentral.com/articles/Monitoring/118079/