Хранимая процедура, которая обрабатывает 1, 2 или 3 значения.

StackOverflow https://stackoverflow.com/questions/1040614

Вопрос

я использую хранимую процедуру для запуска некоторых запросов в моей базе данных.Значение берется из строки запроса, а затем передается в хранимую процедуру.Дело в том, что пользователь может выбрать более 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. Используйте необязательные параметры (например, один int, один float, один varchar ИЛИ значения по умолчанию)
  3. Используйте разные хранимые процедуры

Я бы предложил номер 1, чтобы разобраться с приоритетом типов данных и преобразованием типов в клиентском коде, если это актуально.В противном случае необязательные параметры/значения по умолчанию, если тип данных тот же.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top