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).