none
Saber que tamaño tengo que darle a un campo en base al tipo que se quiere convertir RRS feed

  • Pregunta

  • Buenos días.

    Tengo varios campos de varios tipos de valores y quisiera saber cada campo cuanto bytes ocupa y como calcularlo su tamaño.

    Si me podéis pasar una url donde pueda ver cada tipo lo que ocupa y como calcular para que luego cuando los convierta no me quede corto en las conversiones estaría genial.

    Ejemplo

    Tengo el campo YY tipo nvarchar(50) si lo convierto a varbinary() a que tamaño lo tendría que poner.

    No quiero tener que utilizar el max.

    Muchas gracias.


    sábado, 9 de marzo de 2019 21:06

Todas las respuestas

  • Deleted
    • Propuesto como respuesta Pedro Alfaro lunes, 11 de marzo de 2019 15:50
    sábado, 9 de marzo de 2019 22:13
  • Hola Lignou:

    Lo normal,sería que fuesen el doble que la longitud de nvarchar, o lo que es lo mismo, los mismos bytes, pero como no hay nada mejor que comprobarlo.

    ---- tabla para generar 4000 carácteres nvarchar
    DECLARE @table TABLE
    (id    INT IDENTITY(1, 1), 
     valor NVARCHAR(4000)
    );
    
    DECLARE @contador INT;
    SET @contador = 0;
    DECLARE @caracter NVARCHAR(4000);
    SET @caracter = CHAR(65);
    WHILE @contador < 4000
        BEGIN
            INSERT INTO @table(valor)
    		    VALUES(@caracter);
            SET @caracter = @caracter + CHAR(65);
            SET @contador = @contador + 1;
        END;
    -- tenemos en @table 4000 caracteres nvachra
    DECLARE @tam TABLE
    (alias    NVARCHAR(MAX), 
     longitud INT
    )
    -- segunda tabla donde van a estar todo lo insertado y su longitud
    ;WITH cte
         AS (SELECT valor, 
                    LEN(valor) AS longitud
             FROM @table)
         INSERT INTO @tam
                SELECT c.valor, 
                       c.longitud --Cast(c.alias as binary(c.longitud)) as longs 
                FROM cte c;
    --- insertamos los registros
    DECLARE @max INT=
    (
        SELECT LEN(valor)
        FROM @table
        WHERE id =
        (
            SELECT MAX(id)
            FROM @table
        )
    );
    -- verificamos que max es igual a 4000
    SELECT @max;
    
    DECLARE @tabl TABLE
    (alias  NVARCHAR(MAX), 
     al     VARBINARY(7998), 
     alias2 NVARCHAR(MAX)
    );
    -- insertamos en @tabl el texto nvarchar, el texto en varbinay pero con 7998 bytes
    INSERT INTO @tabl
           SELECT alias, 
                  CAST(alias AS VARBINARY(7998)), 
                  CAST(CAST(alias AS VARBINARY(7998)) AS NVARCHAR(MAX))--- lo recuperamos como nvarchar
           FROM @tam;
    SELECT *
    FROM @tabl
    WHERE alias <> alias2; -- solo pueden salir los erroneos (truncados).
    

    Resultado una fila de diferencia, lo que quiere decir, que como he ejecutado el cast contra 7998 bytes y no 8000 como debiera, hay un elemento truncado.

    Resolución, es igual a la longitud de NVARCHAR por 2.

    varbinary

    https://docs.microsoft.com/es-es/sql/t-sql/data-types/binary-and-varbinary-transact-sql?view=sql-server-2017

    • Editado Javi Fernández F sábado, 9 de marzo de 2019 22:47 Incluir link
    • Propuesto como respuesta Pedro Alfaro lunes, 11 de marzo de 2019 15:50
    sábado, 9 de marzo de 2019 22:46
  • Buenos días Javi, por lo que he visto si tengo un campo con nvarchar(50) si lo quiero convertir a varbinary lo mínimo que me vale es varbinary(124) si pongo a 123 falla, así que el hecho si mi varchar es de 50 si le pongo ((50*2)+2)=102 no me vale.

    domingo, 10 de marzo de 2019 11:56
  • Deleted
    domingo, 10 de marzo de 2019 13:00