NVARCHAR Удаление десятичных точек в процедуре электронной почты - PullRequest
0 голосов
/ 12 июня 2018

Я занят модификацией скрипта, который выводит данные из временной таблицы в скрипт, отправляемый нашим пользователям.Он отслеживает нашу статистику использования 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

Полный сценарий:

--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/

1 Ответ

0 голосов
/ 12 июня 2018

Я не уверен, что происходило в фоновом режиме, однако я решил изменить скрипт, чтобы он никогда не использовал временную таблицу и сохранялся прямо в физическую таблицу.Сделав это, я изменил предложение from в своем последнем операторе построения XML, и запрос работал без применения какой-либо логики к фактическому столбцу.

Спасибо за помощь и предложения, думаю, мне просто нужно перестать смотреть на это длянемного, чтобы облегчить разум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...