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