Saltar al contenido

Procedimiento almacenado con número variable de parámetros

Solución:

Puede pasarlo como una lista separada por comas, luego usar una función de división y unirse a los resultados.

CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(INT, Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]', 'INT')
           FROM
           (
               SELECT [XML] = CONVERT(XML, '<i>' 
                    + REPLACE(@List, @Delimiter, '</i><i>') 
                    + '</i>').query('.')
           ) AS a
           CROSS APPLY
           [XML].nodes('i') AS x(i)
       ) AS y
       WHERE Item IS NOT NULL
   );

Ahora su procedimiento almacenado:

CREATE PROCEDURE dbo.doStuff
    @List VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT cols FROM dbo.table AS t
        INNER JOIN dbo.SplitInts(@List, ',') AS list
        ON t.ID = list.Item;
END
GO

Entonces para llamarlo:

EXEC dbo.doStuff @List="1, 2, 3, ...";

Puede ver algunos antecedentes, otras opciones y comparaciones de rendimiento aquí:

  • Divida las cuerdas de la manera correcta o de la siguiente mejor manera
  • Dividir cuerdas: un seguimiento
  • División de cadenas: ahora con menos T-SQL
  • Comparación de métodos de división / concatenación de cadenas
  • Procesando una lista de enteros: mi enfoque
  • Dividir una lista de números enteros: otro resumen
  • Más sobre la división de listas: delimitadores personalizados, prevención de duplicados y mantenimiento del orden
  • Eliminar duplicados de cadenas en SQL Server

Sin embargo, en SQL Server 2016 o superior, debería mirar STRING_SPLIT() y STRING_AGG():

  • Supuestos y sorpresas de rendimiento: STRING_SPLIT ()
  • STRING_SPLIT () en SQL Server 2016: seguimiento n. ° 1
  • STRING_SPLIT () en SQL Server 2016: seguimiento n. ° 2
  • SQL Server v.Next: rendimiento de STRING_AGG ()
  • Resuelva viejos problemas con las nuevas funciones STRING_AGG y STRING_SPLIT de SQL Server

Los procedimientos almacenados admiten parámetros opcionales. Como C # 4, puede especificar un valor predeterminado usando =. Por ejemplo:

create procedure dbo.doStuff(
     @stuffId int = null, 
     @stuffSubId int = null, 
     ...)
as
...

Para los parámetros que no desea pasar, configúrelos en null o no los agregue a cmd.Parameters en absoluto. Tendrán su valor predeterminado en el procedimiento almacenado

SQLServer te deja pasar TABLE parámetro al procedimiento almacenado. Para que pueda definir el tipo de tabla, CREATE TYPE LIST_OF_IDS AS TABLE (id int not null primary key), modifique su procedimiento para aceptar una variable de este tipo (debería ser de solo lectura).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *