2011-09-18 45 views
13

He almacenados procedimiento en el que tengo que pasar parámetros, pero el problema es que no estoy seguro de cómo muchos parámetros va a venir puede ser 1, en la próxima carrera que puede ser 5.procedimiento almacenado con número variable de parámetros

cmd.Parameters.Add(new SqlParameter("@id", id) 

¿Alguien puede ayudarme cómo puedo pasar estos números variables de parámetros en el procedimiento almacenado? Gracias

+1

Para pasar un número variable de parámetros que sólo tendría lógica condicional en su código de cliente para añadir los parámetros necesarios, pero ¿quiere decir que usted quiere saber ¿Cómo pasar un número variable de 'id's al proceso almacenado? –

+0

sí ... es algo así como pasar arreglos al procedimiento almacenado ... pero la longitud de esta matriz puede variar. – CPDS

+0

¿Para qué es RDBMS (incluida la versión)? –

Respuesta

13

Se podía pasarlo en una lista separada por comas, a continuación, utilizar una función de división, y unirse en contra de 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 el 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 llamarlo:

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

Se puede ver algunos antecedentes, otras opciones, y las comparaciones de rendimiento aquí:

Por supuesto, si usted está utilizando SQL Server 2008 o mejor, es posible que pueda pasar éstos en el uso mucho más eficiente Parámetros de valores de tabla (TVP). Ver aquí para una rápida introducción:

5

SQLServer permite pasar el parámetro TABLE al procedimiento almacenado. Así se puede definir el tipo de mesa, CREATE TYPE LIST_OF_IDS AS TABLE (id int not null primary key), alterar su procedimiento para aceptar una variable de este tipo (que debería ser de sólo lectura).

2

Ha considerado el uso dictionary para ese propósito? Le permitirá pasar cualquier número de parámetros como pares clave-valor. entonces tendrá que acaba de pasar por el diccionario y añadir a esos parámetros cmd.

void DoStuff(Dictionary<string, object> parameters) 
{ 
    // some code 
    foreach(var param in parameters) 
    { 
     cmd.Parameters.Add(new SqlParameter(param.Key, param.Value); 
    } 
    // some code 
} 

En el procedimiento almacenado en sí mismo deberá especificar los valores predeterminados para los parámetros.

CREATE PROCEDURE DoStuff(
    @id INT = NULL, 
    @value INT = NULL, 
    -- the list of parameters with their default values goes here 
    ) 
AS 
-- procedure body 
+0

Esto está en el lado C# ... ¿Cómo puedo leer esto en el lado del servidor sql ... cómo voy a crear procedimiento? – CPDS

+0

Puede verificar la respuesta de Andomar para la muestra del procedimiento. Acabo de agregar un fragmento similar para tener todo en el mismo lugar. – Li0liQ

6

Los procedimientos almacenados apoyan parámetros opcionales. Al igual que 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, o bien ponerlos a null o no los agregue a cmd.Parameters en absoluto. Ellos tendrán su valor por defecto en el procedimiento almacenado

Cuestiones relacionadas