Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да завъртя атрибутите на XML колона в T-SQL

Разгледайте този динамичен пивот и наскоро този - основно трябва да можете да SELECT DISTINCT FieldName за да използвате тази техника за динамично изграждане на вашата заявка.

Ето пълния отговор за вашия конкретен проблем (обърнете внимание, че има слабост в реда на колоните, когато генерирате списъка от отделните атрибути, за да знаете в какъв ред трябва да се показват колоните):

DECLARE @template AS varchar(MAX)
SET @template = 'SELECT 
    FormEntryId
    ,{@col_list}
    ,DateCreated 
FROM FormEntry'

DECLARE @col_template AS varchar(MAX)
SET @col_template = 'FormXML.value(''/Root[1]/Form[1]/FormData[@FieldName="{FieldName}"][1]/@FieldValue'',''varchar(max)'') AS {FieldName}'

DECLARE @col_list AS varchar(MAX)

;WITH FieldNames AS (
    SELECT DISTINCT FieldName
    FROM FormEntry
    CROSS APPLY (
        SELECT X.FieldName.value('@FieldName', 'varchar(255)')
        FROM FormXML.nodes('/Root[1]/Form[1]/FormData') AS X(FieldName)
    ) AS Y (FieldName)
)
SELECT @col_list = COALESCE(@col_list + ',', '') + REPLACE(@col_template, '{FieldName}', FieldName)
FROM FieldNames

DECLARE @sql AS varchar(MAX)
SET @sql = REPLACE(@template, '{@col_list}', @col_list)

EXEC (@sql)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL за определяне на минимални последователни дни на достъп?

  2. Как да върнете низ в обратен ред с помощта на SQL Server – REVERSE()

  3. Защо конструкторът на име/стойност на SqlParameter третира 0 като нула?

  4. Lead() и LAG() функционалност в SQL Server 2008

  5. Проблеми със синхронизирането на база данни на SQL Server