ver salida procedimientos procedimiento parametros guardar fecha ejemplo ejecutar con como codigo almacenados almacenado sql sql-server-2008 stored-procedures optional-parameters

salida - Parámetros de procedimiento almacenados de SQL Server



procedimiento almacenado sql server select (6)

¿Por qué pasaría un parámetro a un procedimiento almacenado que no lo usa?

Me parece que es mejor que construyas declaraciones SQL dinámicas y luego las ejecutes. Lo que estás tratando de hacer con el SP no funcionará, e incluso si pudieras cambiar lo que estás haciendo de tal manera que se adapte a un número variable de parámetros, entonces esencialmente estarías usando SQL generado dinámicamente, estás derrotando el propósito de teniendo / usando un SP en primer lugar. Los SP tienen un rol, pero no hay solución en todos los casos.

Estoy desarrollando un marco, en el que soy un procedimiento almacenado de llamadas con parámetros creados dinámicamente. Estoy construyendo la colección de parámetros en el tiempo de ejecución.

El problema ocurre cuando paso un parámetro al procedimiento almacenado, pero el proceso almacenado no acepta dicho parámetro.

Por ejemplo, mi procedimiento almacenado es:

CREATE PROCEDURE GetTaskEvents @TaskName varchar(50) AS BEGIN -- SP Logic END

Llamar al procedimiento almacenado como:

EXEC GetTaskEvents @TaskName = ''TESTTASK'', @ID = 2

Esto arroja el siguiente error:

Msg 8144, Level 16, State 2, Procedure GetTaskEvents, Line 0 Procedure or function GetTaskEvents has too many arguments specified.

Esto funciona bien en Sybase ASE, que simplemente ignora cualquier parámetro adicional. ¿Se podría lograr esto con el servidor MSSQL 2008? Cualquier ayuda, muy apreciada. Gracias


Aquí asumo una pequeña suposición, pero supongo que la lógica dentro del procedimiento se divide a través de la tarea. ¿Y no puedes tener parámetros anulables como se sugirió @Yuck debido a la dinámica de los parámetros?

Así que yendo por mi suposición

Si TaskName = "Path1" Then Something

Si TaskName = "Path2" Then Something Else

Mi idea inicial es que, si tiene funciones separadas con lógica empresarial, necesita crear, y puede determinar que tiene entre 5 y 10 escenarios diferentes, en lugar de escribir procedimientos almacenados individuales según sea necesario, en lugar de intentar una solución única que se adapte a todos enfoque. Puede ser un poco desordenado para mantener.

Pero si debes ...

¿Por qué no probar SQL dinámico, como lo sugiere @EJ Brennan? (Perdóneme, no he tocado SQL desde hace un tiempo, así que mi sintaxis podría estar oxidada) Dicho esto, no sé si es el mejor enfoque, pero podría esto. posiblemente satisfacer sus necesidades?

CREATE PROCEDURE GetTaskEvents @TaskName varchar(50) @Values varchar(200) AS BEGIN DECLARE @SQL VARCHAR(MAX) IF @TaskName = ''Something'' BEGIN @SQL = ''INSERT INTO.....'' + CHAR(13) @SQL += @Values + CHAR(13) END IF @TaskName = ''Something Else'' BEGIN @SQL = ''DELETE SOMETHING WHERE'' + CHAR(13) @SQL += @Values + CHAR(13) END PRINT(@SQL) EXEC(@SQL) END

(El CHAR (13) agrega una nueva línea ... un viejo habbit que recogí en alguna parte, usado para ayudar a depurar / leer los procedimientos dinámicos cuando ejecuto SQL profiler.)


Está analizando una combinación incorrecta de parámetros. En este caso, pasar @TaskName = y @ID lugar de @TaskName = .SP solo necesita un parámetro.


SQL Server no le permite pasar parámetros a un procedimiento que no ha definido. Creo que lo más cerca que puedes llegar a este tipo de diseño es usar parámetros opcionales como ese:

CREATE PROCEDURE GetTaskEvents @TaskName varchar(50), @ID int = NULL AS BEGIN -- SP Logic END;

Debería incluir todos los parámetros posibles que pueda usar en la definición. Entonces sería libre de llamar al procedimiento de cualquier manera:

EXEC GetTaskEvents @TaskName = ''TESTTASK'', @ID = 2; EXEC GetTaskEvents @TaskName = ''TESTTASK''; -- @ID gets NULL here


utilícelo como este Exec GetTaskEvents @paramOne, @parmTwo, @ParamN


CREATE PROCEDURE GetTaskEvents @TaskName varchar(50), @Id INT AS BEGIN -- SP Logic END

Procedimiento de llamada

DECLARE @return_value nvarchar(50) EXEC @return_value = GetTaskEvents @TaskName = ''TaskName'', @Id =2 SELECT ''Return Value'' = @return_value