SQL - SP SQL Parámetros Lista

 
Vista:
sin imagen de perfil

SP SQL Parámetros Lista

Publicado por Alejandro (3 intervenciones) el 28/06/2017 10:02:16
Buenas a tod@s.

Estoy intentando modificar un procedimiento almacenado que me permita añadir un parámetro que sea una lista de usuarios (@users) para añadir a la consulta mediante la cláusula IN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE PROCEDURE paginaOperationGroupDatesTypeUsers
@PageSize INT,
@PageNumber INT,
@Date1 DATETIME,
@Date2 DATETIME,
@OperationGroupType VARCHAR(50),
@Users VARCHAR(MAX)
AS
 BEGIN
  SET NOCOUNT ON
  SELECT *
  FROM (
  SELECT *,
  ROW_NUMBER() OVER (ORDER BY id_operation_group ASC) AS
  RowNumber
  FROM
  OPERATION_GROUP
  WHERE operation_group_type = @OperationGroupType AND end_date between @Date1 and @Date2
  AND user IN @Users)
    AS OperationGroupPaged
  WHERE RowNumber BETWEEN @PageSize * @PageNumber + 1
  AND @PageSize * (@PageNumber + 1)
 END

La cuestión es que no me deja crear el procedimiento, ya que me dice que la expresión booleana
1
AND user IN @Users
no es correcta.

El parámetro @Users contendría cadena tipo '1111', '2222', '3333'

No soy un experto en SQL y no veo qué estoy haciendo mal. ¿Alguna sugerencia?

Gracias a tod@s.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

SP SQL Parámetros Lista

Publicado por Alejandro (3 intervenciones) el 28/06/2017 10:24:42
He modificado la consulta añadiendo paréntesis de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE PROCEDURE paginaOperationGroupDatesTypeUsers
@PageSize INT,
@PageNumber INT,
@Date1 DATETIME,
@Date2 DATETIME,
@OperationGroupType VARCHAR(50),
@Users VARCHAR(MAX)
AS
 BEGIN
  SET NOCOUNT ON
  SELECT *
  FROM (
  SELECT *,
  ROW_NUMBER() OVER (ORDER BY id_operation_group ASC) AS
  RowNumber
  FROM
  OPERATION_GROUP
  WHERE operation_group_type = @OperationGroupType AND end_date between @Date1 and @Date2
  AND user IN @Users)
    AS OperationGroupPaged
  WHERE RowNumber BETWEEN @PageSize * @PageNumber + 1
  AND @PageSize * (@PageNumber + 1)
 END

Me ha creado el procedimiento pero al ejecutarlo de la siguiente forma no me funciona:

1
EXEC paginaOperationGroupDatesTypeUsers 10,  0, '20161230 00:00:00', '20181230 00:00:00', 'DEPOSIT', '(''1111'', ''3333'')'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

SP SQL Parámetros Lista

Publicado por leonardo_josue (1173 intervenciones) el 28/06/2017 15:42:20
Hola Alejandro:

Siempre que tienes que trabajar con SQL Dinámico, es decir, que construyes a partir de parámetros, es mejor trabajar con el comando SP_EXECUTESQL,,, de tal suerte que antes de ejecutarlo puedes imprimir la consulta SQL que se está formando y veas si tienes algún problema con la sintaxis... aquí está la documentación oficial:

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql

y aquí algunos ejemplos de lo que quieres hacer:

https://stackoverflow.com/questions/1525126/sql-in-clause-in-stored-procedurehow-to-pass-values

Haz la prueba y nos comentas.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

SP SQL Parámetros Lista

Publicado por Isaias (1921 intervenciones) el 28/06/2017 18:06:45
Exacto lo que comenta Leo, solo una observacion, cuando utiliza Query Dinamico, Si su motor es SQL Server, este, no hara uso de los INDICES.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

SP SQL Parámetros Lista

Publicado por Alejandro (3 intervenciones) el 04/07/2017 12:27:43
Buenas tardes.

Disculpen mi tardanza en escribir, pero estuve bastante liado.

He conseguido resolver el problema.

Las versiones anteriores a SQL no son capaces de trabajar con parámetros en formato Arrays. Por lo que he creado una función que separe las cadenas y las introduzca en una tabla virtual. De esta forma puedo usarlos en el procedimiento. almacenado.

A continuación muestro ambos códigos por si les fueran útiles en un futuro.

Función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE FUNCTION stringlist_to_tbl (@list varchar(MAX))
   RETURNS @tbl TABLE (valueLogin VARCHAR(MAX) NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int,
		   @valueData  varchar(MAX)
 
   SELECT @pos = 1, @nextpos = 1
 
   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos)
 
	  SELECT @valuelen =
				CASE WHEN @nextpos > 0 THEN @nextpos -1
                 ELSE len(@list) + 1
			END
	SELECT @valueData = substring(@list, @pos, @valuelen)
      INSERT @tbl (valueLogin)
         VALUES (@valueData)
      SELECT @pos = @nextpos + 1
   END
   RETURN
END


Procedimiento almacenado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE PROCEDURE paginaOperationGroupDatesTypeUsers
@PageSize INT,
@PageNumber INT,
@Date1 DATETIME,
@Date2 DATETIME,
@OperationGroupType VARCHAR(50),
@Users VARCHAR(MAX)
AS
 BEGIN
  SET NOCOUNT ON
  SELECT *
  FROM (
  SELECT *,
  ROW_NUMBER() OVER (ORDER BY end_date DESC) AS
  RowNumber
  FROM
  OPERATION_GROUP
  WHERE operation_group_type = @OperationGroupType AND end_date between @Date1 and @Date2
  AND OPERATION_GROUP.[user] IN (SELECT * FROM stringlist_to_tbl(@Users)))
    AS OperationGroupPaged
  WHERE RowNumber BETWEEN @PageSize * @PageNumber + 1
  AND @PageSize * (@PageNumber + 1)
 END

Muchas gracias y un saludo a tod@s.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar