1

我需要一个可以将许多列合并为一个的查询。

例如,我有一列有这些行:

'JOHNNY WALKER KILIAN JOURNET ANNA FROST'
'JOHNNY CUERVO KILIAN JOURNET ANNA FROST'
'JOHNNY WALKER KILIAN JONES ANNA FROST'
'JOHNNY WALKER KILIAN JOURNET EMELIE FROST'

然后我想将所有行合并为一个:

'JOHNNY CUERVO KILIAN JONES EMELIE FROST'

是否有可能做到这一点?这是因为我正在尝试进行动态查询,然后从 XML 中检索条件,但我不知道我将从 XML 中获得多少条件,所以我正在尝试使用 CTE 循环来自XML 并替换动态查询。最后我得到了很多行的查询和一些条件..所以我需要合并差异并保留相似性。

XML 是:

<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>yleon@email.com.ve</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">AND USU_ID=2</USU_CODICIONES2>
    <USU_CODICIONES3 TIPO="MC" MARCADOR="CONDICIONES3">AND USU_ID=3</USU_CODICIONES3>
    <USU_CODICIONES4 TIPO="MC" MARCADOR="CONDICIONES4">AND USU_ID=4</USU_CODICIONES4>
    <USU_CODICIONES5 TIPO="MC" MARCADOR="CONDICIONES5">AND USU_ID=5</USU_CODICIONES5>
    <USU_CODICIONES6 TIPO="MC" MARCADOR="CONDICIONES6">AND USU_ID=6</USU_CODICIONES6>        
  </PARAMETROS>
</ROOT>

我的代码是:

DECLARE @XML AS XML    
DECLARE @QUERY AS VARCHAR(MAX)
--Lectura del XML almacenado en la tabla SESIONESREPORTES  

SET @XML = (SELECT TOP 1 SER_PARAMETROS FROM   SESIONESREPORTES WHERE  REP_ID = 4 AND SER_ID = 9)

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

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

2 回答 2

3

@Alexander Fedorenko 提供了一个更好的解决方案,更简单,潜在事件较小,速度更快,我刚刚适应了这个问题:

DECLARE @xml XML = '<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>yleon@email.com.ve</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 的动态查询构造循环条件

于 2013-05-31T20:00:37.200 回答
2

这是一个(主要是)XQuery 解决方案:

declare @xml xml
set @xml = '<ROOT>
  <PARAMETROS>
    <USU_LOGIN>yleon</USU_LOGIN>
    <USU_NOMBREPRIMERO>Yerusha</USU_NOMBREPRIMERO>
    <USU_APELLIDOPRIMERO>Leon</USU_APELLIDOPRIMERO>
    <USU_EMAIL>yleon@email.com.ve</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">AND USU_ID=2</USU_CODICIONES2>
    <USU_CODICIONES3 TIPO="MC" MARCADOR="CONDICIONES3">AND USU_ID=3</USU_CODICIONES3>
    <USU_CODICIONES4 TIPO="MC" MARCADOR="CONDICIONES4">AND USU_ID=4</USU_CODICIONES4>
    <USU_CODICIONES5 TIPO="MC" MARCADOR="CONDICIONES5">AND USU_ID=5</USU_CODICIONES5>
    <USU_CODICIONES6 TIPO="MC" MARCADOR="CONDICIONES6">AND USU_ID=6</USU_CODICIONES6>        
  </PARAMETROS>
</ROOT>'

DECLARE @QUERY VARCHAR(MAX)
SELECT @QUERY = CONVERT(VARCHAR(MAX),
    @xml.query('
        "SELECT * FROM CAIN..USUARIOS WHERE 1=1",
        for $cond in /ROOT/PARAMETROS/*[fn:substring(fn:local-name(), 1, 14) = "USU_CODICIONES" and @TIPO="MC"]/text()
            return string($cond)'))

PRINT @QUERY

产生:

SELECT * FROM CAIN..USUARIOS WHERE 1=1 AND USU_ID=1 AND USU_ID=2 AND USU_ID=3 AND USU_ID=4 AND USU_ID=5 AND USU_ID=6
于 2013-05-29T13:26:15.190 回答