我正在使用存储过程在数据库中运行一些查询。该值取自查询字符串,然后传递给存储过程。问题是,用户可以选择超过 1 个选项来生成 3 个或更多查询字符串。

例如 http://localhost.com/test.aspx?param=76&param2=79

我知道如何从查询中获取值,但我让存储过程接受 1 或 2 或 3 个值,有点像重载

例如

   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;
       }


    }

这是存储过程的副本..

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
有帮助吗?

解决方案

您可以在您的存储过程使用默认参数:

CREATE PROCEDURE [dbo].[getSealRecordID] 
(   @PARAM int = -1,
    @PARAM2 int = -1,
    @PARAM3 int = -1
)
    AS
...

当然,你也会有你的where子句中处理这些值:

...
WHERE (@PARAM = -1 OR (condition with @PARAM))
  AND (@PARAM1 = -1 OR (condition with @PARAM1))
  AND (@PARAM2 = -1 OR (condition with @PARAM2))

其他提示

就可以把所述参数默认值的存储的过程,则可以用1,2或3个值调用它。

CREATE PROC MyProc
    (@Param1 int,
     @Param2 int = null,
     @Param3 int = null)
AS
-- body of proc here

每个值都是 int 吗?还是各有不同?

您的选择:

  1. 处理客户端中的过载并调用一个存储过程
  2. 使用可选参数(例如 1 个 int、1 个 float、1 个 varchar 或者 默认值)
  3. 使用不同的存储过程

我建议第 1 点处理客户端代码中的数据类型优先级和类型转换(如果相关的话)。否则,如果数据类型相同,则可选参数/默认值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top