MS-SQL and XML is cool
2008-03-09 @ 18:19#
i work with XML - *alot.* and i need a relational database that makes XML work as painless as possible. and that's why i really like the way MS SQL Server supports streaming XML. here is a simple (but elegant) example:
given these two tables:
CREATE TABLE [dbo].[CBGames]( [id] [int] IDENTITY(1,1) NOT NULL, [userid] [nvarchar](50) NOT NULL, [datecreated] [datetime] NOT NULL CONSTRAINT [DF_CBGames_datecreated] DEFAULT (getdate()), [maxattempts] [int] NOT NULL CONSTRAINT [DF_CBGames_maxattempts] DEFAULT ((10)), [status] [nvarchar](50) NOT NULL CONSTRAINT [DF_CBGames_status] DEFAULT (N'In-Progress'), [place1] [nvarchar](50) NOT NULL, [place2] [nvarchar](50) NOT NULL, [place3] [nvarchar](50) NOT NULL, [place4] [nvarchar](50) NOT NULL ) CREATE TABLE [dbo].[CBAttempts]( [id] [int] IDENTITY(1,1) NOT NULL, [gameid] [int] NOT NULL, [place1] [nvarchar](50) NOT NULL, [place2] [nvarchar](50) NOT NULL, [place3] [nvarchar](50) NOT NULL, [place4] [nvarchar](50) NOT NULL )
i can get this XML output:
<games>
<game id="1">
<date-created>2008-03-08T17:09:12.563</date-created>
<max-attempts>10</max-attempts>
<status>In-Progress</status>
<code>
<place1>A</place1>
<place2>B</place2>
<place3>C</place3>
<place4>D</place4>
</code>
<attempts>
<attempt>
<place1>D</place1>
<place2>E</place2>
<place3>F</place3>
<place4>A</place4>
</attempt>
<attempt>
<place1>C</place1>
<place2>D</place2>
<place3>E</place3>
<place4>F</place4>
</attempt>
<attempt>
<place1>A</place1>
<place2>B</place2>
<place3>C</place3>
<place4>D</place4>
</attempt>
</attempts>
</game>
</games>
with this SELECT query:
CREATE PROCEDURE [dbo].[cbgames_list]
@userid nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
select
cbg.id as '@id',
cbg.datecreated as 'date-created',
cbg.maxattempts as 'max-attempts',
cbg.status as 'status',
cbg.place1 as 'code/place1',
cbg.place2 as 'code/place2',
cbg.place3 as 'code/place3',
cbg.place4 as 'code/place4',
(select
cba.place1,
cba.place2,
cba.place3,
cba.place4
from cbattempts cba
where cbg.id=cba.gameid
order by cba.id
for xml path('attempt'), type) as 'attempts'
from cbgames cbg
where userid=@userid
for xml path('game'), root('games')
END