J'écris une procédure stockée pour utiliser la procédure stockée du système sp_send_dbmail
Pour envoyer un e-mail HTML. J'ai déjà utilisé cette procédure mais je n'ai jamais rencontré ce problème auparavant. J'utilise la méthode de construction présentée ici
Sur Internet, je pense que NVARCHAR(MAX)
devrait contenir un maximum de 2 147 483 647 caractères ( ref )
Cependant, lorsque je crée ma sortie si je PRINT
la sortie, elle ne renvoie pas la chaîne complète.
J'ai testé mon SQL séparément et cela revient comme prévu.
De toute évidence, j'ai une erreur, mais quelqu'un peut-il indiquer ce que c'est, s'il vous plaît!
Le script est:
Declare @RawPart varchar(30);
Declare @PO varchar(30);
Declare @NL varchar(12)='<br/>';
DECLARE @BodyHTML NVARCHAR(MAX) ;
Declare @SubjectText varchar(200);
Declare @StaffEmail varchar(50);
Declare @MrpDate varchar(12);
Set @MrpDate=(Select convert (varchar(12),[SnapshotDate],103) from [dbo].[MrpReqCtl] )
set @StaffEmail='[email protected]';
set @SubjectText ='Schedule Update from MRP Email';
Set @PO='106277';
Set @RawPart=(Select Distinct MStockCode From dbo.PorMasterDetail Where PurchaseOrder=@PO and LineType=1)
--N'<p>Attention From the Mrp run '+@MrpDate+N'</p><p>Has Detected Changed to the following Schedules</>'
----Define Customer Schedule Table
-- +
Set @BodyHTML= N'<H1>Customer Schedules</H1>' +
N'<table border="1">' +
N'<tr><th>Sales Order</th><th>Line</th><th>Ship Date</th><th>Customer</th><th>Stockcode</th><th>Os Qty</th><th>Status</th>'
--Stage 2 Customer Order Details Table
+cast( (Select SalesOrder, SalesOrderLine, convert(varchar(12),MLineShipDate,103) as DispatchDate
, Customer,rtrim(StockCode)+' - '+ rtrim(F.StockCodeDesc) ,cast(OutstandingQty as int) OutstandingQty
,Case When MLineShipDate<datediff(d,0,getdate()) Then 'Arrs' else '' end as Status
From [dbo].[CHCIW_ForwardOrders] F
Where F.StockCode IN (
Select BC.TopLevel
FROM dbo.K3_vwBOMCosting BC
inner Join dbo.InvMaster I On BC.StockCode=I.StockCode
Where [TopLevel] like 'MG%' and I.StockCode=@RawPart )
and MLineShipDate<dateadd(m,3,datediff(d,0,getdate()) )
Order By MLineShipDate
For xml Path('tr'), Type) as nvarchar(max))+ N'</table>' ;
Set @BodyHTML=rtrim(@BodyHTML)
Print len(@BodyHTML)
Print @BodyHTML
Cependant, la sortie est:
6326
<H1>Customer Schedules</H1><table border="1"><tr><th>Sales Order</th><th>Line</th><th>Ship Date</th><th>Customer</th><th>Stockcode</th><th>Os Qty</th><th>Status</th><tr><SalesOrder>010879</SalesOrder><SalesOrderLine>5</SalesOrderLine><DispatchDate>30/10/2017</DispatchDate><Customer>BORG02</Customer>MG16311504501 - VW 1.0L EU6ZD Machined -1565<OutstandingQty>249</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>177</SalesOrderLine><DispatchDate>10/11/2017</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>846</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010879</SalesOrder><SalesOrderLine>7</SalesOrderLine><DispatchDate>10/11/2017</DispatchDate><Customer>BORG02</Customer>MG16311504501 - VW 1.0L EU6ZD Machined -1565<OutstandingQty>468</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>179</SalesOrderLine><DispatchDate>17/11/2017</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>7020</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010879</SalesOrder><SalesOrderLine>9</SalesOrderLine><DispatchDate>17/11/2017</DispatchDate><Customer>BORG02</Customer>MG16311504501 - VW 1.0L EU6ZD Machined -1565<OutstandingQty>468</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>181</SalesOrderLine><DispatchDate>24/11/2017</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>7020</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010879</SalesOrder><SalesOrderLine>11</SalesOrderLine><DispatchDate>30/11/2017</DispatchDate><Customer>BORG02</Customer>MG16311504501 - VW 1.0L EU6ZD Machined -1565<OutstandingQty>720</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>183</SalesOrderLine><DispatchDate>01/12/2017</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>7020</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010879</SalesOrder><SalesOrderLine>41</SalesOrderLine><DispatchDate>07/12/2017</DispatchDate><Customer>BORG02</Customer>MG16311504501 - VW 1.0L EU6ZD Machined -1565<OutstandingQty>1224</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>185</SalesOrderLine><DispatchDate>08/12/2017</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>7020</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010879</SalesOrder><SalesOrderLine>43</SalesOrderLine><DispatchDate>14/12/2017</DispatchDate><Customer>BORG02</Customer>MG16311504501 - VW 1.0L EU6ZD Machined -1565<OutstandingQty>252</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>187</SalesOrderLine><DispatchDate>15/12/2017</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>7020</OutstandingQty><Status>Arrs</Status></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>189</SalesOrderLine><DispatchDate>22/12/2017</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>7020</OutstandingQty><Status/></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>191</SalesOrderLine><DispatchDate>29/12/2017</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>10920</OutstandingQty><Status/></tr><tr><SalesOrder>010879</SalesOrder><SalesOrderLine>45</SalesOrderLine><DispatchDate>04/01/2018</DispatchDate><Customer>BORG02</Customer>MG16311504501 - VW 1.0L EU6ZD Machined -1565<OutstandingQty>252</OutstandingQty><Status/></tr><tr><SalesOrder>010158</SalesOrder><SalesOrderLine>193</SalesOrderLine><DispatchDate>05/01/2018</DispatchDate><Customer>BORG02</Customer>XXXXXXXXX507 - SOME DECRIPTIVE TEXT XXXXX<OutstandingQty>10920</OutstandingQty><Status/
Il s'agit d'une limitation de ce qui peut être affiché dans l'onglet "Messages" via PRINT
ou RAISERROR
. Ils peuvent afficher 4 000 caractères de données NVARCHAR
ou 8 000 caractères de données VARCHAR
.
Il existe plusieurs façons de contourner ce problème, telles que la rupture de la chaîne en morceaux qui fonctionneront dans ces limites via un CURSOR
. Mais si:
alors vous pouvez simplement convertir la chaîne en VARCHAR(8000)
:
PRINT CONVERT(VARCHAR(8000), @BodyHTML);
Par exemple:
DECLARE @String NVARCHAR(MAX) = N'A'
+ REPLICATE(CONVERT(NVARCHAR(MAX), N'_'), 7998)
+ N'Z123';
PRINT CONVERT(VARCHAR(MAX), @String);
Si vous exécutez cela et vérifiez ensuite l'onglet "Messages", vous devriez avoir une ligne qui commence par "A___", puis beaucoup plus de "_", puis se termine par "___Z". Vous ne devriez pas voir le "123" (car ce sont des caractères 8001 - 8003). Si vous placez votre curseur à la fin de cette ligne (juste à droite du "Z"), les valeurs "Col" et "Ch" dans la barre bleue en bas de SSMS doivent être toutes les deux 8001.
P.S. L'utilisation de VARCHAR(8000)
ou VARCHAR(MAX)
devrait convenir. Je n'ai pas vu de différence de comportement entre eux pour ce scénario particulier .
En outre, pour clarifier la limite de type de données: 2 147 483 647 est le nombre maximal de octets qui peuvent être stockés dans une colonne NVARCHAR(MAX)
. Étant donné que NVARCHAR
est des données UTF-16, il utilise 2 ou 4 octets par chaque "caractère", les caractères les plus généralement utilisés tombant dans le groupe de 2 octets. Cela signifie que vous pouvez obtenir au plus MOITIÉ de cette limite d'octets sous forme de caractères, si tous les caractères sont de la variété à 2 octets. Si des caractères sont de la variété à 4 octets, le nombre total de caractères qu'il peut contenir diminue car le nombre maximal d'octets ne change pas.
En outre, la documentation est incorrecte dans la mesure où elle indique que "2 147 483 647 est le nombre maximal de caractères". Je vais soumettre un correct pour cela.