Procedimiento almacenado que maneja 1 o 2 o 3 valores
-
22-07-2019 - |
Pregunta
Estoy usando un procedimiento almacenado para ejecutar algunas consultas en mi base de datos. El valor se toma de una cadena de consulta y luego se pasa al procedimiento almacenado. La cuestión es que el usuario puede seleccionar más de 1 opción que genera 3 o más cadenas de consulta.
p. http://localhost.com/test.aspx?param=76¶m2=79
Sé cómo tomar los valores de la consulta, pero hago que el procedimiento almacenado acepte 1 o 2 o 3 valores como una sobrecarga
por ejemplo
setValue (int val)
{
this.value = val;
}
setValue (double val)
{
this.value = (int) val
}
setValue (string val)
{
try
{
this.value = Integer.parseInt(val)
}
catch (Exception e)
{
System.out.println(e.getMessage());
return 0;
}
}
esta es una copia del procedimiento almacenado ..
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getSealRecordID] (@TRANSFER_ID int)
AS
-- Declare variables
SELECT DISTINCT "FGFSTRANSFERS"."CONSIDERATION", "FGFSTRANSFERS"."AMOUNT_TRANSFER", "FGFSTRANSFERS"."DATE",
"FGFSTRANSFERS"."TRANSFER_ID",
CURR = CASE "FGFSTransferDetails"."CURR"
WHEN 'USD' THEN 'United States Dollars'
WHEN 'JMD' THEN 'Jamaican Dollars'
WHEN 'CAD' THEN 'Canadian Dollars'
WHEN 'GBP' THEN 'POUNDS'
WHEN 'EUR' THEN 'EUROS'
END
,"FGFSCUSTOMERS"."CMF_NAME_1", "FGFSCUSTOMERS"."CMF_NAME_2" , "FGFSTransferDetails"."AMOUNT",
Cons_Curr = CASE "FGFSTransferDetails"."CURR" -- As Cons_Curr,
WHEN 'USD' THEN 'United States Dollars'
WHEN 'JMD' THEN 'Jamaican Dollars'
WHEN 'CAD' THEN 'Canadian Dollars'
WHEN 'GBP' THEN 'POUNDS'
WHEN 'EUR' THEN 'EUROS'
END
,"FGFSTransferDetails"."DESCRIPTION", "FGFSTransferDetails"."IMID"
FROM ("FGFSInvestment"."dbo"."FGFSTransferDetails" "FGFSTransferDetails" INNER JOIN "FGFSInvestment"."dbo"."FGFSTRANSFERS" "FGFSTRANSFERS" ON "FGFSTransferDetails"."TRANSFER_ID"="FGFSTRANSFERS"."TRANSFER_ID") INNER JOIN "FGFSInvestment"."dbo"."FGFSCUSTOMERS" "FGFSCUSTOMERS" ON "FGFSTRANSFERS"."CUSTODIAN"="FGFSCUSTOMERS"."CMF_ACCOUNT"
WHERE "FGFSTRANSFERS"."TRANSFER_ID"= @TRANSFER_ID AND "FGFSTransferDetails"."TRANSFER_ID"=@TRANSFER_ID
Solución
Puede usar parámetros predeterminados en su procedimiento almacenado:
CREATE PROCEDURE [dbo].[getSealRecordID]
( @PARAM int = -1,
@PARAM2 int = -1,
@PARAM3 int = -1
)
AS
...
por supuesto, tendrá que manejar esos valores en su cláusula where:
...
WHERE (@PARAM = -1 OR (condition with @PARAM))
AND (@PARAM1 = -1 OR (condition with @PARAM1))
AND (@PARAM2 = -1 OR (condition with @PARAM2))
Otros consejos
puede poner valores predeterminados en los parámetros para su proceso almacenado, luego puede llamarlo con 1, 2 o 3 valores.
CREATE PROC MyProc
(@Param1 int,
@Param2 int = null,
@Param3 int = null)
AS
-- body of proc here
¿Cada valor será int? ¿O cada uno será diferente?
Sus opciones:
- Lidiar con la sobrecarga en el cliente y llamar a un proceso almacenado
- Utilice parámetros opcionales (por ejemplo, un int, un flotante, un varchar O valores predeterminados)
- Usar diferentes procesos almacenados
Sugeriría el número 1 para tratar la prioridad de tipo de datos y la conversión de tipos en el código del cliente, si es relevante. De lo contrario, parámetros opcionales / valores predeterminados si el mismo tipo de datos.