sql >> データベース >  >> RDS >> Sqlserver

多くの列を1つにマージし、類似性を維持し、相違点を置き換えます

    これは、@ Alexander Fedorenkoによって提供された、より優れたソリューションであり、よりシンプルで、マイナーな潜在的なインシデントがあり、より高速です。私はこの質問に適応しました:

    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
    

    xmlからの動的クエリ構築ループ条件



    1. #1139-正規表現から「繰り返し演算子オペランドが無効です」というエラーが発生しました

    2. SQLテーブルを行列形式に変換します

    3. JAVAでのSQLServerクエリ通知

    4. MySQLでカウンタをインクリメントして値を返す方法