0

I have the following xquery for Sql server 2008 tables.

declare @tableName sysname = 'tableName'
declare @colNames xml = (select COLUMN_NAME from INFORMATION_SCHEMA.columns where TABLE_NAME = @tableName for xml path(''), elements)
select @colNames.query('<html><body>
<table>
<tr>
{
    for $c in /COLUMN_NAME
    return data($c)[1]
}
</tr>
</table>
</body></html>
')

However, it returns the following xml.

<html>
  <body>
    <table>
      <tr>col1col2col3col4col5</tr>
    </table>
  </body>
</html>

And the expected result is

<html>
  <body>
    <table>
      <tr><th>col1</th><th>col2</th><th>col3</th><th>col4</th><th>col5</th></tr>
    </table>
  </body>
</html>

I tried to change return data($c)[1] to concat("<th>", data($c)[1], "</th>"). However, the < and > were escaped to &lt; and &gt;?

2

2 Answers 2

2
for $c in /COLUMN_NAME
return element th { data($c)[1] }

or

for $c in /COLUMN_NAME
return <th>{ data($c)[1] }</th>
Sign up to request clarification or add additional context in comments.

Comments

1

Alternatively you could do it directly in your query.

select
  (
  select COLUMN_NAME as '*'
  from INFORMATION_SCHEMA.columns 
  where TABLE_NAME = @tableName
  for xml path('th'), root('tr'), type
  ) as "table"
for xml path('body'), root('html')

or

select
  (
  select COLUMN_NAME as th
  from INFORMATION_SCHEMA.columns 
  where TABLE_NAME = @tableName
  for xml path(''), type
  ) as "html/body/table/tr"
for xml path('')

2 Comments

Great solution too. Is it possible to append the data of the table to xml under the column header too? I think I will need to create a new question for it.
@NickW Don't have the time right now for this but I did something similar before. Have a look at this: stackoverflow.com/a/7087899/569436

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.