Introduction
When we use
the SELECT statement with XML columns the DISTINCT clause and GROUP BY clause is
not working. This article is related to alteration solution of this problem.
Hope you find it informative.
Example
To understand
it properly let’s take an example
Step-1[ Create Base table and Insert
Records in it ]
IF OBJECT_ID(N'[dbo].[tbl_DemoData]', N'U')IS NOT NULL
BEGIN
DROP TABLE [dbo].[tbl_DemoData];
END
GO
CREATE TABLE [dbo].[tbl_DemoData]
(
IDNO INT NOT
NULL,
SNAME VARCHAR(50) NOT NULL,
DETAILS XML NOT NULL
);
GO
INSERT INTO [dbo].[tbl_DemoData]
(IDNO, SNAME, DETAILS)
VALUES
(1, 'Joydeep Das', '<_x0023_AAA
Name="Joydeep Das" CLass="1" />'),
(1, 'Joydeep Das', '<_x0023_AAA
Name="Joydeep Das" CLass="1" />'),
(1, 'Joydeep Das', '<_x0023_AAA
Name="Joydeep Das" CLass="1" />'),
(2, 'Avijit Ghorui', '<_x0023_AAA
Name="Avijit Ghorui" CLass="1" />'),
(2, 'Avijit Ghorui', '<_x0023_AAA
Name="Avijit Ghorui" CLass="1" />'),
(2, 'Avijit Ghorui', '<_x0023_AAA
Name="Avijit Ghorui" CLass="1" />');
GO
SELECT IDNO, SNAME, DETAILS FROM [dbo].[tbl_DemoData];
GO
IDNO SNAME DETAILS
1 Joydeep Das <_x0023_AAA
Name="Joydeep Das" CLass="1" />
1 Joydeep Das <_x0023_AAA
Name="Joydeep Das" CLass="1" />
1 Joydeep Das <_x0023_AAA
Name="Joydeep Das" CLass="1" />
2 Avijit Ghorui <_x0023_AAA
Name="Avijit Ghorui" CLass="1" />
2 Avijit Ghorui <_x0023_AAA
Name="Avijit Ghorui" CLass="1" />
2 Avijit Ghorui <_x0023_AAA
Name="Avijit Ghorui" CLass="1" />
Step-2[ Try to Use GROUP BY and DISTINCT
Clause ]
SELECT IDNO, SNAME, DETAILS
FROM [dbo].[tbl_DemoData]
GROUP BY IDNO, SNAME, DETAILS;
Error:
Msg 305, Level 16, State 1,
Line 38
The XML data type cannot
be compared or sorted, except when using the IS NULL operator.
SELECT DISTINCT IDNO, SNAME, DETAILS
FROM [dbo].[tbl_DemoData];
Error:
Msg 421, Level 16, State 1,
Line 43
The xml data type cannot
be selected as DISTINCT because it is not comparable.
Step-3 [ Solution for GROUP BY Clause
]
SELECT IDNO, SNAME, CONVERT(XML, CONVERT(VARCHAR(Max), DETAILS)) AS DETAILS
FROM [dbo].[tbl_DemoData]
GROUP BY IDNO, SNAME, CONVERT(VARCHAR(Max), DETAILS);
IDNO SNAME DETAILS
1 Joydeep Das <_x0023_AAA
Name="Joydeep Das" CLass="1" />
2 Avijit Ghorui <_x0023_AAA
Name="Avijit Ghorui" CLass="1" />
Step-4 [ Solution for DISTINCT Clause
]
WITH myDistinct
AS
(
SELECT
ROW_NUMBER()
OVER(PARTITION BY IDNO ORDER BY IDNO) AS SRL,
IDNO, SNAME, DETAILS
IDNO, SNAME, DETAILS
FROM [dbo].[tbl_DemoData]
)
SELECT IDNO, SNAME, DETAILS FROM
myDistinct WHERE SRL=1;
IDNO SNAME DETAILS
1 Joydeep Das <_x0023_AAA
Name="Joydeep Das" CLass="1" />
2 Avijit Ghorui <_x0023_AAA
Name="Avijit Ghorui" CLass="1" />
Hope you like
it.
Posted
By: MR. JOYDEEP DAS
No comments:
Post a Comment