How to return XML from SQL Server 2008 that is structured with multiple selections sharing a common parent
How to return XML from SQL Server 2008 that is structured with multiple selections sharing a common parent
I've tried using "FOR XML PATH", "FOR XML EXPLICIT" and "FOR XML AUTO" but the data is never structured with the correct heirarchy.
Basically, I have one parent table (Customers) and 3 child tables. Each table has a customerid column. There is a one-to-many relationship from the Customers table to each of the 3 child tables.
As a mock example, I have a parent "Customers" table, and I have 3 other tables - Products, Hobbies and Vehicles - all related to the Customers table by a customerid.
What is the SQL code to achieve the following kind of structure -
Answer by Dibstar for How to return XML from SQL Server 2008 that is structured with multiple selections sharing a common parent
Using FOR XML RAW
IF OBJECT_ID ('tempdb..#customer') IS NOT NULL DROP TABLE #Customer IF OBJECT_ID ('tempdb..#product') IS NOT NULL DROP TABLE #product IF OBJECT_ID ('tempdb..#vehicle') IS NOT NULL DROP TABLE #Vehicle IF OBJECT_ID ('tempdb..#hobbies') IS NOT NULL DROP TABLE #Hobbies CREATE TABLE #Customer (id INT,name NVARCHAR(20)) INSERT INTO #customer SELECT 1,'Fred' UNION ALL SELECT 2,'Sue' CREATE TABLE #product(customer_id INT, name NVARCHAR(20)) INSERT INTO #product SELECt 1 AS id, 'table' as product UNION ALL SELECT 1 AS id, 'chair' as product UNION ALL SELECT 1 AS id, 'wardrobe' as product UNION ALL SELECT 2 AS id, 'CD Player' as product UNION ALL SELECT 2 AS id, 'Picture Frame' as product CREATE TABLE #vehicle(customer_id INT, name NVARCHAR(20),colour NVARCHAR(20)) INSERT INTO #vehicle SELECt 1 AS id, 'Car' as vehicle,'red' as colour UNION ALL SELECT 1 AS id, 'bicycle' as vehicle,'Blue' AS colour UNION ALL SELECT 2 AS id, 'Car' as vehicle, 'Yellow' as colour CREATE TABLE #hobbies(customer_id INT, name NVARCHAR(20)) INSERT INTO #hobbies SELECt 1 AS id, 'Golf' as name UNION ALL SELECT 1 AS id, 'Swimming' as name UNION ALL SELECT 2 AS id, 'Dancing' as name UNION ALL SELECT 2 AS id, 'Reading' as name SELECT c.id AS id ,c.name AS name ,(SELECT p.name FROM #product p WHERE p.customer_id = c.id FOR XML RAW('Products'),TYPE) AS Products ,(SELECT h.name FROM #hobbies h WHERE h.customer_id = c.id FOR XML RAW('Hobbies'),TYPE) AS Hobbies ,(SELECT v.name,v.colour FROM #vehicle v WHERE v.customer_id = c.id FOR XML RAW('Vehicle'),TYPE) AS Vehicle FROM #customer c FOR XML RAW('Customer'), ROOT('Customers')
Answer by marc_s for How to return XML from SQL Server 2008 that is structured with multiple selections sharing a common parent
Try something like this - it uses FOR XML PATH
and subselects to create the "linked" sub-nodes for a given customer (I limited this to two sub tables - but you should get the "gist" of it and be able to extend it to any number of linked subtables):
SELECT CustomerID AS '@CustomerID', CustName AS '@Name', (SELECT ProductName AS '@productname' FROM dbo.Products p WHERE p.CustomerID = c.CustomerID FOR XML PATH('Product'), TYPE) AS 'Products', (SELECT HobbyName AS '@hobbyname' FROM dbo.Hobbies h WHERE h.CUstomerID = c.CustomerID FOR XML PATH('Hobby'), TYPE) AS 'Hobbies' FROM dbo.Customers c FOR XML PATH('Customer'), ROOT('Customers')
Gives me an output something like:
Answer by hiren patel for How to return XML from SQL Server 2008 that is structured with multiple selections sharing a common parent
USE [EAPP_BranchDb] GO /****** Object: StoredProcedure [dbo].[SP_procXMLOutput] Script Date: 09/05/2013 15:14:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[SP_procXMLOutput] @Data XML OUTPUT AS BEGIN DECLARE @myDoc xml, @myDoc1 xml, @var_Doc1 nvarchar(max), @myDoc2 xml, @var1 nvarchar(max), @var2 nvarchar(max), @var3 nvarchar(max), @var_id as int, @var_id1 as nvarchar(10), @var_grp_id1 as nvarchar(10), @var_parent_id as bigint, @var_grp_id as nvarchar(10), @var_parent_type as nvarchar(1), @var_type as nvarchar(10), @xml XML, @grp1 nvarchar(max), @grp2 nvarchar(max) DECLARE xml_cur_id CURSOR FOR SELECT id, parent_id, grp_id, parent_type,type FROM xml_table where parent_type='P' order by id DECLARE xml_cur_grpid CURSOR FOR SELECT GRP_ID FROM xml_table WHERE parent_id=6 and parent_type='C' group by GRP_ID BEGIN SET @myDoc = N'
Answer by Roman Pekar for How to return XML from SQL Server 2008 that is structured with multiple selections sharing a common parent
select c.customerid, c.name, ( select p.productname from Products as p where p.customerid = c.customerid for xml raw('Product'), root('Products'), type ), ( select h.hobbyname from Hobbies as h where h.customerid = c.customerid for xml raw('Hobby'), root('Hobbies'), type ), ( select v.name, v.color from Vehicles as v where v.customerid = c.customerid for xml raw('Vehicle'), root('Vehicles'), type ) from Customers as c for xml raw('Customer'), root('Customers')
Answer by user2583789 for How to return XML from SQL Server 2008 that is structured with multiple selections sharing a common parent
DECLARE @sampleCount int =10 SET STATISTICS TIME ON SELECT (SELECT TOP (@sampleCount) * FROM [Table1]TABLESAMPLE(100 PERCENT) FOR XML PATH('tbl1'), TYPE) AS 'tbl1', (SELECT top (@sampleCount) * FROM [Table2] TABLESAMPLE(100 PERCENT) FOR XML PATH('tbl2'), TYPE) AS 'tbl2', (SELECT top (@sampleCount) * FROM [Table3] TABLESAMPLE(100 PERCENT) FOR XML PATH('tbl3'), TYPE) AS 'tbl3' FOR XML PATH(''), ROOT('Table')
Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72
0 comments:
Post a Comment