none
Ayuda!!! Unir bytes en un solo byte SQL RRS feed

  • Pregunta

  • Hola a todos.

    Tengo lo siguiente:

    Me han pedido unir dos bytes en uno solo es decir que si tengo lo siguiente 0 0 0 0 0 0 0 0 2 2 9 7 6 4 0 6 debe quedarme como:

    00 00 00 00 22 97 64 06 

    00

    Es decir unir cada 2 bytes en uno, es como para "reducir" el peso de los registros


    Mi pregunta es como puedo unir dos bytes en uno solo?? se puede realizar esto en SQL? existe alguna funcion en SQL? o si me pueden orientar para realizarlo en .Net

    Les agradezco mucho su ayuda.


    Yami

    martes, 3 de enero de 2017 16:25

Respuestas

  • Hola  muchas gracias por sus respuestas y ayuda.

    Después de revisar y analizar se ha encontrado la siguiente solución:

    

    Con lo anterior se logra "comprimir" la longitud del archivo. 

    Adjunto una captura del fichero generado, donde puede observarse que la longitud del registro seleccionado es de 29 bytes (8 + 3 + 17 + 1):

    Puede compararse el registro seleccionado en el fichero con sus valores en la tabla:

    Ahora el PROBLEMA  que se me presenta es el siguiente:

    • Se están generando 2 bytes al inicio de cada registro (1D 00), lo cual incrementa la longitud de 29 a 31 bytes. El fichero estaría perfecto si conseguimos que esos bytes no se escriban. Alguien sabe por que se está generando estos dos registros, será alguna funcióin del BCP que me genera esto?
    • Agradezco su ayuda.


    Yami

    jueves, 5 de enero de 2017 14:32

Todas las respuestas

  • No me queda claro lo que requieres, necesitas agrupar estas cadenas con un espacio que los separe cada 2 caracteres? O buscas algo especifico?


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    martes, 3 de enero de 2017 16:37
  • Hola gracias por responder.

    Lo que quiero es agrupar de a dos en dos los datos de la cadena sin ningún espacio, con el fin de que cada pareja quede pesando un byte.

    0 0 0 0 0 0 0 0 2 2 9 7 6 4 0 6 debe quedarme como:

    00 

    00

    00

    00

    22

    97

    64

    06 


    Yami

    martes, 3 de enero de 2017 16:43
  • Hola Yamid, aqui esta el código, pruebalo y me confirmas si esta acorde a lo que requieres, por cierto, he usado MS SQL Server 2016, ahí aprovecho la función STRING_SPLIT, en caso que uses otra versión nos cuentas y lo que habria que hacer es usar una función alternativa.

    DECLARE @BytesTable AS TABLE
        (
          ByteId INT ,
          Array VARCHAR(40)
        );
    
    INSERT  INTO @BytesTable
            ( ByteId, Array )
    VALUES  ( 1, -- ByteId - int
              '0 0 0 0 0 0 0 0 2 2 9 7 6 4 0 6'  -- Array - varchar(30)
              ),
            ( 2, '0 0 0 0 0 0 0 0 4 2 9 7 6 1 2 8'  -- Array - varchar(30)
              );
    
    ;
    WITH    MyCTE ( Rn, ByteId, Value )
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY ByteId ) AS RN ,
                            ByteId ,
                            value
                   FROM     @BytesTable
                            CROSS APPLY STRING_SPLIT(Array, ' ')
                 )
        SELECT  ( SELECT    CAST(T.Value AS VARCHAR(10)) + ''
                            + CAST(T1.Value AS VARCHAR(10))
                  FROM      MyCTE AS T1
                  WHERE     T1.Rn = T.Rn + 1
                ) ID ,
                ( SELECT    ByteId
                  FROM      MyCTE AS T1
                  WHERE     T1.Rn = T.Rn + 1
                ) ByteId
        FROM    MyCTE AS T
        WHERE   Rn % 2 = 1;


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    martes, 3 de enero de 2017 22:19
  • Yamid Pertuz,

    {?}- Es decir unir cada 2 bytes en uno, es como para "reducir" el peso de los registros

    Si lo que muestras es una cadena de caracteres considera que cada carácter corresponde a un byte, ¿cómo esperas contener dos bytes en un sólo byte?

    ¿Podrías indicar con algo de detalle lo que en realidad deseas hacer además de mencionar el tipo de dato que deseas "comprimir"? 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 3 de enero de 2017 22:29
  • Hola gracias por responder.

    Lo que se se desea es que la información se comprima, es decir que si tenemos un campo que en base de datos tiene el valor ‘0000000022976406’ que ocupa 16 caracteres (y por tanto 16 bytes) lo que queremos es que en fichero solo ocupe 8 bytes (aunque eso suponga 8 ‘caracteres’ no imprimibles).


    Yami

    martes, 3 de enero de 2017 22:55
  • Yamid Pertuz,

    En tal caso almacena únicamente los valores que tengan representación numérica y descarta los que no lo tengan, los ceros a la izquierda no tienen representación numérica y que entiendo son parte de un formato que luego en la presentación lo puedes volver a definir. En cualquier caso, si deseas lograr una compresión de datos debes de ver otros mecanismos como compresión a nivel de fila o de página, te dejo unos enlaces:

    Compresión de datos en SQL Server 2012

    Compresión de datos y paginas en SQL Server 2008

    Compresión de datos en SQL Server 2008 (II de III)



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 3 de enero de 2017 23:30
  • Hola Yamid,

    Williams tiene razón, ¿ y si guardas los valores como bigint que ocupa 8 bytes ?. Siguiendo el ejemplo de Geovanny puedes hacerlo con:

    SELECT CAST(REPLACE(array,' ','') AS bigint ) FROM @BytesTable

    después si los necesitas puedes formatearlos en la salida

    SELECT REPLICATE('0',LEN (CONVERT(varchar, CAST(REPLACE(array,' ','') AS bigint )))  ) + CONVERT(varchar, CAST(REPLACE(array,' ','') AS bigint )) FROM @BytesTable

    Saludos



    miércoles, 4 de enero de 2017 10:24
  • Hola muchas gracias por la respuesta.

    Voy a mirar los artículos que me citas.

    Muchas gracias.


    Yami

    miércoles, 4 de enero de 2017 12:49
  • Hola  muchas gracias por sus respuestas y ayuda.

    Después de revisar y analizar se ha encontrado la siguiente solución:

    

    Con lo anterior se logra "comprimir" la longitud del archivo. 

    Adjunto una captura del fichero generado, donde puede observarse que la longitud del registro seleccionado es de 29 bytes (8 + 3 + 17 + 1):

    Puede compararse el registro seleccionado en el fichero con sus valores en la tabla:

    Ahora el PROBLEMA  que se me presenta es el siguiente:

    • Se están generando 2 bytes al inicio de cada registro (1D 00), lo cual incrementa la longitud de 29 a 31 bytes. El fichero estaría perfecto si conseguimos que esos bytes no se escriban. Alguien sabe por que se está generando estos dos registros, será alguna funcióin del BCP que me genera esto?
    • Agradezco su ayuda.


    Yami

    jueves, 5 de enero de 2017 14:32