martes, 26 de enero de 2021

XML to TABLE sql-t; Read XML with SQL

EJEMPLO DE CÓMO LEER UN XML CON APOYO DE SQL SERVER  SQL-T 



XML = 

<Reporte xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <status>OK</status>
  <nombre> Energía Asignada de Importación y Exportación</nombre>
  <proceso>MDA</proceso>
  <sistema>BCA</sistema>
  <area>PÚBLICA</area>
  <Enlace_Int>
    <enlace_int>LA ROSITA - IMPERIAL VALLEY</enlace_int>
    <Valores>
      <Valorv3>
        <fecha>2021/01/26</fecha>
        <hora>1</hora>
        <imp_comer_asig>0</imp_comer_asig>
        <imp_asig_ener_inad>0</imp_asig_ener_inad>
        <imp_asig_conf>0</imp_asig_conf>
        <imp_asig_cil>0</imp_asig_cil>
        <imp_total>0</imp_total>
        <exp_comer_asig>0</exp_comer_asig>
        <exp_asig_ener_inad>0</exp_asig_ener_inad>
        <exp_asig_conf>0</exp_asig_conf>
        <exp_asig_cil>0</exp_asig_cil>
        <exp_total>0</exp_total>
      </Valorv3>
      <Valorv3>
        <fecha>2021/01/26</fecha>
        <hora>2</hora>
        <imp_comer_asig>0</imp_comer_asig>
        <imp_asig_ener_inad>0</imp_asig_ener_inad>
        <imp_asig_conf>0</imp_asig_conf>
        <imp_asig_cil>0</imp_asig_cil>
        <imp_total>0</imp_total>
        <exp_comer_asig>0</exp_comer_asig>
        <exp_asig_ener_inad>0</exp_asig_ener_inad>
        <exp_asig_conf>0</exp_asig_conf>
        <exp_asig_cil>0</exp_asig_cil>
        <exp_total>0</exp_total>
      </Valorv3>

 

@Valor contiene el XML



viernes, 12 de junio de 2020

SELECT INSERT



 PARA CREAR UN SELECT INSERT

SELECT '
SELECT
   ClaveNodo    = '''+ CONVERT(VARCHAR(MAX), ISNULL(ClaveNodo,'NULL'))    +'''' + ', '+'
   Fecha        = '''+ CONVERT(VARCHAR(MAX), ISNULL(Fecha,'NULL'))        +'''' + ', '+'
   PML_AVG      = '''+ CONVERT(VARCHAR(MAX), AVG   (PrecioMarginalLocal)) +'''' + ' ' +
'UNION ALL'

FROM         Hechos.pmls
WHERE        Claveprocesomercado = 'MDA'
AND          Clavesistema        = 'SIN'

AND          Fecha               >= '2018-01-01'
AND          ClaveNodo           = '01AAN-85'
GROUP BY     Fecha, ClaveNodo
ORDER BY     Fecha


RESULTADO:















SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-01',  PML_AVG  = '668.858333'  UNION ALL
SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-02',  PML_AVG  = '1081.464583' UNION ALL
SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-03',  PML_AVG  = '1520.851250' UNION ALL
SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-04',  PML_AVG  = '1526.005000' UNION ALL
SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-05',  PML_AVG  = '1597.107916' UNION ALL
SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-06',  PML_AVG  = '962.502916'  UNION ALL
SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-07',  PML_AVG  = '688.050833'  UNION ALL
SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-08',  PML_AVG  = '1041.629166' UNION ALL

SELECT    ClaveNodo = '01AAN-85',  Fecha  = '2018-01-09',  PML_AVG  = '913.394583'  ;













UTILIZANDO UNA FUNCIÓN







IF OBJECT_ID ('dbo.up_GeneraCodigo_SelectInsert') IS NOT NULL DROP PROCEDURE dbo.up_GeneraCodigo_SelectInsert;
GO
--------------------------------------- select insert



CREATE PROCEDURE dbo.up_GeneraCodigo_SelectInsert
 @Columnas                VARCHAR(500),                                 -- COLUMAS SEPARADAS POR COMAS  ','  EJ:  Column1,Column2,Column3
 @NombreTabla       VARCHAR (50)                                  -- NOMBRE TABLA CON TODO Y ESQUEMA EJ:  SchemaName.TableName
 AS   
  BEGIN
 
DECLARE @MaxColumns TINYINT
--DECLARE @TableName VARCHAR (50);
DECLARE @Salida     VARCHAR (MAX)


       SELECT
                    Id = ROW_NUMBER() OVER (ORDER BY [value])
                    ,SplitColumn = [value]
       INTO   #Columnas

       FROM  STRING_SPLIT (@Columnas,',')


  
    SELECT @MaxColumns = MAX (Id) FROM #Columnas


DECLARE @Num              TINYINT
DECLARE @NombreColumna     VARCHAR (50)

SET @NUM = 0;
SET @Salida = 'SELECT '
--SET @TableName = 'Middle.Deals'

WHILE (@NUM <= @MaxColumns)
       BEGIN
             SET @NUM =  ( SELECT TOP 1 ID FROM #Columnas WHERE Id > @Num ORDER BY Id);
            
             IF (@NUM IS NOT NULL)
                    BEGIN
                                                                       
                          SET @NombreColumna = (SELECT LTRIM(RTRIM(SplitColumn)) FROM #Columnas WHERE Id = @Num);                                
                          SET @Salida = @Salida + '''' + CASE WHEN @NUM = 1 THEN 'SELECT ' ELSE '' END  + CHAR(13) + CHAR(9) + @NombreColumna + ' = ' +  '''''''' + '+' +' CONVERT(VARCHAR(MAX), ISNULL(' + @NombreColumna + ',''NULL''))' + '+' + '''''''''' + '+' + '''' + ','  +  '''' + '+'
                    END
       END
      

       SET @Salida = @Salida + ' FROM ' + @NombreTabla
      
       SET @Salida = REPLACE (@Salida, '+'',''+ FROM', ' + ''UNION ALL''  FROM');
       SET @Salida = REPLACE (@Salida, ' FROM', CHAR(13) + 'FROM');
      
       PRINT @salida

DROP TABLE #Columnas

END
GO






exec dbo.up_GeneraCodigo_SelectInsert
                                                                 @Columnas           = 'FolioBack,TradeDate,TradeHour',
                                                                 @NombreTabla = 'Middle.Deals';

GO










hay que acomodar el procedure para que entregue esto:
SELECT
            
       REPLACE (
       'SELECT
      
    [ClaveNodo]                  = '''+ ISNULL(  CONVERT(VARCHAR(MAX),  [ClaveNodo]                 )      ,'NULL')  +''''+','+'

       [IdInyeccionEnergia]= '''+ ISNULL(  CONVERT(VARCHAR(MAX),  [IdInyeccionEnergia]  )       ,'NULL')  +''''+','+'
      
       [NombreNodo]        = '''+ ISNULL(  CONVERT(VARCHAR(MAX),  [NombreNodo]                 )      ,'NULL')  +'''' + 'UNION ALL'
       ,'''NULL''','NULL')
FROM [DW].[Dim].[Nodos]



SELECT         [ClaveNodo]   = '01AAN-85',   [IdInyeccionEnergia]= NULL,    [NombreNodo]  = 'Actopan' ;


EL CONVERT ES PRIMERO, LUEGO EL ISNULL
AGREGAR EL REPLACE PARA QUITAR EL 'NULL'  =>  NULL