none
Como introducir en una variable tipo Int una cadena de valores separados por coma RRS feed

  • Pregunta

  • Hola

    Trabajo con SQL Server 2014. Resulta que tengo una tabla llamada @Ventas

    DECLARE @Ventas AS TABLE
    (
       IdArticulo Int,
       FechaAlbaran  Date,
       NumeroAlbaran Int,
       ImporteVenta decimal(15,5)
       
    )
    
    ;
    
    INSERT INTO @Ventas
    VALUES(1,'01/01/2016',1,24.5),
     (1,'03/02/2016',4,32.5),
     (16,'08/05/2016',5,11.5),
     (16,'08/05/2016',5,9.24),
     (9,'11/06/2016',6,8.74),
     (9,'11/06/2016',6,22.5),
     (9,'11/06/2016',6,11.4),
     (9,'15/06/2016',7,6.5),
     (9,'15/06/2016',7,9.8),
     (9,'17/06/2016',8,44),
     (9,'17/06/2016',8,24.15),
     (4,'19/07/2016',9,27.8),
     (4,'19/07/2016',9,14.6);

    Pues bien, necesitaria aplicarle el siguiente script:

     Select * from @Ventas
     where IdArticulo in(@GrupoArticulos)

    Para ello, he declarado una variable de tipo integer de la siguiente manera:

    Declare @GrupoArticulos Int
    set @GrupoArticulos=('1,9,16')

    Pues bien, recibo el siguiente error:

    Error de conversión al convertir el valor varchar '1,9,16' al tipo de datos int.

    Destacar el hecho de que este es solo un trozo de mi script. El que realmente aplico en mi aplicación es mucho mas amplio y utiliza una cadena de varios valores del campo IdArticulo separada por comas en varios lugares. Es por ello que creo que es una buena práctica poner una variable al principio del script y llamar a ella en el resto.

    ¿Se os ocurre alguna forma?¿lo haríais de alguna otra manera?

    Muchas gracias

    Angel

    viernes, 23 de septiembre de 2016 11:43

Respuestas

  • Angeleci,

    No es correcto lo que intentas realizar, no puedes asignar un valor alfanumérico a una variable de tipo numérico, de hecho el mensaje de error que obtienes detalla la excepción.

    Una forma de lograr el cometido es conteniendo los valores en una variable de tabla e intersectar valores iguales mediante combinación:

    DECLARE @T table (IdArticulo int);
    INSERT INTO @T VALUES (1), (12);
    
    SELECT 
        * 
    FROM 
        @Ventas v
        INNER JOIN @T t ON (V.IdArticulo = T.IdArticulo)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta HunchbackMVP viernes, 23 de septiembre de 2016 13:42
    • Marcado como respuesta Angeleci viernes, 23 de septiembre de 2016 17:14
    viernes, 23 de septiembre de 2016 13:15
  • Hola Angel,

    Lo que sucede en este caso, yo le llamo una ilusion ;)

    La variable contiene un unico valor que es una cadena delimitada, pero sigue siendo un unico valor. Ademas, en T-SQL no existe el concepto de macro-substitucion.

    Ejemplo:

    select 1 as col1
    where '3' in ('3,4,5');

    Esto es equivalente a:

    select 1 as col1
    where '3' = '3,4,5';

    Lo cual es falso.

    Lo mismo ocurre si usamos una variable para almacenar la cadena.

    declare @s varchar(50) = '3,4,5';

    select 1 as col1 
    where '3' in (@s);

    Esto es equivalente a:

    select 1 as col1
    where '3' = @s;

    Hay varias formas de hacer esto, una de ellas sugerida por Willams. Para versiones de SQL Server igual 2008 o mayor lo optimo es usar parametros tipo tabla si es que usas un procedimiento para recivir la lista.

    Aca te dejo un link sobre un articulo con lujo de detalles sobre como hacer esto en T-SQL.

    http://www.sommarskog.se/arrays-in-sql.html


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    • Editado HunchbackMVP viernes, 23 de septiembre de 2016 13:46
    • Marcado como respuesta Angeleci viernes, 23 de septiembre de 2016 17:14
    viernes, 23 de septiembre de 2016 13:42

Todas las respuestas

  • Angeleci,

    No es correcto lo que intentas realizar, no puedes asignar un valor alfanumérico a una variable de tipo numérico, de hecho el mensaje de error que obtienes detalla la excepción.

    Una forma de lograr el cometido es conteniendo los valores en una variable de tabla e intersectar valores iguales mediante combinación:

    DECLARE @T table (IdArticulo int);
    INSERT INTO @T VALUES (1), (12);
    
    SELECT 
        * 
    FROM 
        @Ventas v
        INNER JOIN @T t ON (V.IdArticulo = T.IdArticulo)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta HunchbackMVP viernes, 23 de septiembre de 2016 13:42
    • Marcado como respuesta Angeleci viernes, 23 de septiembre de 2016 17:14
    viernes, 23 de septiembre de 2016 13:15
  • Hola Angel,

    Lo que sucede en este caso, yo le llamo una ilusion ;)

    La variable contiene un unico valor que es una cadena delimitada, pero sigue siendo un unico valor. Ademas, en T-SQL no existe el concepto de macro-substitucion.

    Ejemplo:

    select 1 as col1
    where '3' in ('3,4,5');

    Esto es equivalente a:

    select 1 as col1
    where '3' = '3,4,5';

    Lo cual es falso.

    Lo mismo ocurre si usamos una variable para almacenar la cadena.

    declare @s varchar(50) = '3,4,5';

    select 1 as col1 
    where '3' in (@s);

    Esto es equivalente a:

    select 1 as col1
    where '3' = @s;

    Hay varias formas de hacer esto, una de ellas sugerida por Willams. Para versiones de SQL Server igual 2008 o mayor lo optimo es usar parametros tipo tabla si es que usas un procedimiento para recivir la lista.

    Aca te dejo un link sobre un articulo con lujo de detalles sobre como hacer esto en T-SQL.

    http://www.sommarskog.se/arrays-in-sql.html


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    • Editado HunchbackMVP viernes, 23 de septiembre de 2016 13:46
    • Marcado como respuesta Angeleci viernes, 23 de septiembre de 2016 17:14
    viernes, 23 de septiembre de 2016 13:42