sql >> Databáze >  >> RDS >> Sqlserver

Sloučit mnoho sloupců do jednoho, zachovat podobnost a nahradit rozdíly

zde je lepší řešení, jednodušší, s menšími potenciálními incidenty a rychlejší, poskytl @Alexander Fedorenko, právě jsem se přizpůsobil pro tuto otázku:

DECLARE @xml XML = '<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>[email protected]</USU_EMAIL>
    <USU_FECHACREACION>20130510</USU_FECHACREACION>
    <USU_CODICIONES1 TIPO="MC" MARCADOR="CONDICIONES1">AND USU_ID=1</USU_CODICIONES1>
    <USU_CODICIONES2 TIPO="MC" MARCADOR="CONDICIONES2">OR USU_ID=2</USU_CODICIONES2>
    <USU_CODICIONES3 TIPO="MC" MARCADOR="CONDICIONES3">OR USU_ID=3</USU_CODICIONES3>
    <USU_CODICIONES4 TIPO="MC" MARCADOR="CONDICIONES4">OR USU_ID=4</USU_CODICIONES4>
    <USU_CODICIONES5 TIPO="MC" MARCADOR="CONDICIONES5">OR USU_ID=5</USU_CODICIONES5>
    <USU_CODICIONES6 TIPO="MC" MARCADOR="CONDICIONES6">OR USU_ID=6</USU_CODICIONES6>        
  </PARAMETROS>
</ROOT>'

DECLARE @QUERY NVARCHAR(MAX)

SET @QUERY = 'SELECT * FROM USUARIOS WHERE 1=1 CONDICIONES1 CONDICIONES2 CONDICIONES3 CONDICIONES4 CONDICIONES5 CONDICIONES6'             

  DECLARE  @dsql nvarchar(max)

  SELECT @dsql = REPLACE(COALESCE(@dsql, @QUERY), 
                         T.Item.value('@MARCADOR', 'varchar(255)'),
                         T.Item.value('data(.)', 'varchar(255)'))         
  FROM   @xml.nodes('/ROOT/PARAMETROS/*') AS T(Item)  
  WHERE T.Item.value('data(@TIPO)', 'varchar(255)')='MC'

PRINT @DSQL

Podmínky opakování vytváření dynamického dotazu z xml



  1. Omezte řádky vrácené v dotazu SQL Server pomocí klauzule TOP

  2. Hibernujte automatické generování klíčů pomocí MySQL a Oracle

  3. Jak ukládat neanglické znaky?

  4. Porovnání dat uložených jako varchar