I have the following query which is used to export data in XML format. I was using the same query for years on MS SQL Server 2008.
Recently I had to upgrade to MS SQL Server 2019. Since then, while the query produces a valid XML if i run in the MS SQL Management Studio, it exports a corrupted XML file, with validation errors if if run it using SQLCMD (I use SQLCMD to automate some tasks)
:XML ON
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET ANSI_WARNINGS ON;
SET QUOTED_IDENTIFIER ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET ANSI_PADDING ON;
USE toll;
SELECT
(
SELECT
PRODUCTSTABLE.CODE2 COLLATE Greek_CI_AS AS SKU,
PRODUCTSTABLE.NAME COLLATE Greek_CI_AS AS PRODUCT_NAME,
dbo.MTRMARK.NAME COLLATE Greek_CI_AS AS BRAND,
dbo.MTRMODEL.NAME COLLATE Greek_CI_AS AS GENDER,
dbo.MTRSEASON.CODE COLLATE Greek_CI_AS AS SEASON,
ISNULL(dbo.utbl01.NAME COLLATE Greek_CI_AS,'') AS COLOR,
PRODUCTSTABLE.CODE COLLATE Greek_CI_AS AS SOFT1ID,
/* START VARIATIONS */
(
SELECT
dbo.MTRL.CODE2 + '-' + dbo.CCCMLFINF.CDIM1NAME COLLATE Greek_CI_AS AS VARIATION_SKU,
dbo.CCCMLFINF.CDIM1NAME COLLATE Greek_CI_AS AS SIZE,
CAST(CASE WHEN SUM(dbo.CCCMLFINF.NEWREST) > 0 THEN SUM(dbo.CCCMLFINF.NEWREST) ELSE 0 END AS INT) AS STOCK,
LTRIM(STR(dbo.MTRL.PRICEW, 10, 2)) AS REGULAR_PRICE,
dbo.MTRL.CODE2 COLLATE Greek_CI_AS AS PARENT_SKU,
dbo.CDIMLINES.NAME1 COLLATE Greek_CI_AS AS CDIM,
dbo.MTRL.MTRL AS MTRLID,
dbo.CCCMLFINF.CDIM1,
dbo.CCCMLFINF.CDIMLINES1 AS LINENUM1,
CASE WHEN dbo.MTRL.PRICER = dbo.MTRL.PRICEW THEN '' ELSE LTRIM(STR(dbo.MTRL.PRICER, 10, 2)) END AS SALES_PRICE,
CASE WHEN (dbo.MTREXTRA.BOOL02 = 1 AND CHARINDEX('/' + dbo.CCCMLFINF.CDIM1NAME + '/', dbo.MTREXTRA.VARCHAR01 COLLATE Greek_CI_AS) > 0) THEN 'yes' ELSE 'no' END AS ALLOW_BACKORDER
FROM
dbo.MTRL
INNER JOIN
dbo.CCCMLFINF ON dbo.MTRL.MTRL = dbo.CCCMLFINF.MTRL
INNER JOIN
dbo.MTREXTRA ON dbo.MTRL.MTRL = dbo.MTREXTRA.MTRL
INNER JOIN
dbo.CDIMLINES ON dbo.CCCMLFINF.COMPANY = dbo.CDIMLINES.COMPANY AND dbo.CCCMLFINF.CDIM1 = dbo.CDIMLINES.CDIM AND dbo.CCCMLFINF.CDIMLINES1 = dbo.CDIMLINES.CDIMLINES
WHERE
dbo.MTRL.COMPANY = 2000 AND dbo.MTREXTRA.BOOL01 = 1 AND PRODUCTSTABLE.MTRL = dbo.MTRL.MTRL
GROUP BY
dbo.MTRL.CODE2,
dbo.CCCMLFINF.CDIM1NAME,
dbo.MTRL.PRICEW,
dbo.CCCMLFINF.FISCPRD,
dbo.CDIMLINES.NAME1,
dbo.MTRL.MTRL,
dbo.CCCMLFINF.CDIM1,
dbo.CCCMLFINF.CDIMLINES1,
dbo.MTRL.PRICER,
dbo.MTREXTRA.BOOL02,
dbo.MTREXTRA.VARCHAR01,
dbo.MTREXTRA.VARCHAR02,
dbo.MTREXTRA.VARCHAR03
FOR XML PATH ('Variation'), TYPE, ROOT ('Variations')
) AS Variations
FROM
dbo.MTRL AS PRODUCTSTABLE
INNER JOIN
dbo.MTRSEASON ON PRODUCTSTABLE.COMPANY = dbo.MTRSEASON.COMPANY AND PRODUCTSTABLE.MTRSEASON = dbo.MTRSEASON.MTRSEASON
INNER JOIN
dbo.MTRMARK ON PRODUCTSTABLE.MTRMARK = dbo.MTRMARK.MTRMARK AND PRODUCTSTABLE.COMPANY = dbo.MTRMARK.COMPANY AND PRODUCTSTABLE.SODTYPE = dbo.MTRMARK.SODTYPE
INNER JOIN
dbo.MTRMODEL ON PRODUCTSTABLE.MTRMODEL = dbo.MTRMODEL.MTRMODEL AND PRODUCTSTABLE.COMPANY = dbo.MTRMODEL.COMPANY AND PRODUCTSTABLE.SODTYPE = dbo.MTRMODEL.SODTYPE
INNER JOIN
dbo.MTREXTRA ON PRODUCTSTABLE.MTRL = dbo.MTREXTRA.MTRL
LEFT OUTER JOIN
dbo.utbl01 ON dbo.MTREXTRA.UTBL01 = dbo.UTBL01.UTBL01 AND dbo.utbl01.COMPANY = 2000
WHERE
PRODUCTSTABLE.COMPANY = 2000 AND dbo.MTREXTRA.BOOL01 = 1 AND DATEDIFF(minute, PRODUCTSTABLE.UPDDATE, SYSDATETIME()) < 60
FOR XML PATH('Product'), TYPE
)
FOR XML PATH(''), ROOT('Products');
GO
:XML OFF
My SQLCMD Invocation command is:
SQLCMD -U user -P password -S USER-PCSOFTONE -i QRSqxml.SQL -o QRSproducts_update.xml
I have tried using the -y0 flag with no solution
Any ideas why i have different output between ms sql management studio and sqlcmd?