Вам следует избегать выполнения такого рода SQL внутри хранимых процедур, если только это не является абсолютно необходимым, и вы на 1000% уверены, что правильно очищаете входные данные. Тот факт, что все входные параметры являются varchar, и, похоже, что они хранятся в процессах, используемых для получения информации о платеже, вызывает беспокойство, если не сказать больше. Вы по-прежнему уязвимы для атак SQL-инъекций, выполняя такого рода динамические sql внутри процедур.
Обе процедуры могут быть переписаны следующим образом в одной процедуре:
CREATE PROC [GetPaymentGateway]
@CompanyID VARCHAR(3),
@NBSalesChannel VARCHAR(50) =null,
@CCMSalesChannel VARCHAR(50) =null
AS
BEGIN
SELECT [card_name], [card_type],@CCMSalesChannel as CCMSalesChannel FROM credit_card_master
INNER JOIN PaymentGateway_master
ON PaymentGateway_master.payment_gateway_code = credit_card_master.payment_gateway_code
WHERE [company_id] = @CompanyID
SELECT PG_NetBanking_Charges.Online_DC_Charge_Amt, PaymentGateway_master.Payment_Gateway_Name, @NBSalesChannel as NBSalesChannel FROM PG_NetBanking_Charges
INNER JOIN PaymentGateway_master
ON PaymentGateway_master.payment_gateway_code = PG_NetBanking_Charges.payment_gateway_code
WHERE [company_id] = @CompanyID
END
или, может быть, вы хотите это:
CREATE PROC [GetPaymentGateway]
@CompanyID VARCHAR(3),
@NBSalesChannel VARCHAR(50) =null,
@CCMSalesChannel VARCHAR(50) =null
AS
BEGIN
if (@CCMSalesChannel is not null)
begin
SELECT [card_name], [card_type],@CCMSalesChannel as CCMSalesChannel FROM credit_card_master
INNER JOIN PaymentGateway_master
ON PaymentGateway_master.payment_gateway_code = credit_card_master.payment_gateway_code
WHERE [company_id] = @CompanyID
end
else if (@NBSalesChannel is not null)
begin
SELECT PG_NetBanking_Charges.Online_DC_Charge_Amt, PaymentGateway_master.Payment_Gateway_Name, @NBSalesChannel as NBSalesChannel FROM PG_NetBanking_Charges
INNER JOIN PaymentGateway_master
ON PaymentGateway_master.payment_gateway_code = PG_NetBanking_Charges.payment_gateway_code
WHERE [company_id] = @CompanyID
end
END
Обновление Как правило, можно выбрать определенный столбец на основе параметра во время выполнения, как показано ниже:
SELECT PG_NetBanking_Charges.Online_DC_Charge_Amt, PaymentGateway_master.Payment_Gateway_Name,
case @NBSalesChannel when 'value1' then ColumnA
when 'value2' then ColumnB
when 'anothervalue' then ColumnC
when 'yet_another_value' then ColumnD else
ColumnE end as SalesChannel
FROM PG_NetBanking_Charges
INNER JOIN PaymentGateway_master
ON PaymentGateway_master.payment_gateway_code = PG_NetBanking_Charges.payment_gateway_code
WHERE [company_id] = @CompanyID