Как изменить запрос в хранимой процедуре в зависимости от параметров

Привет, мне нужно изменить запрос в хранимой процедуре в зависимости от значений, введенных параметром

Вот пример того, что я пытаюсь, но у меня нет результатов:

If Exists( Select A.Name From SysObjects A where A.Name = 'sp_iss_APIGetPatientList')
    Drop procedure sp_iss_APIGetPatientList
GO
Create Procedure sp_iss_APIGetPatientList
    @Country varchar(50)

AS

    -- select A.name,A.Code,

   if @Country = 'Uruguay'
      -- add al select A.Country



      -- Al final de todas las condiciones agregar:
         --    from Table A



GO
0
задан 27.11.2019, 23:28
3 ответа

Привет это может подавать тебя, я не знаю структуру твоих подмостков, но добавляю тебя пример с временной таблицей.

Следует отметить, что в этом случае я санкционирую, если их требуют, ты можешь делать это формой, в которой ты желаешь цель, он состоит в том, чтобы давать тебе идею.

типов Привета

if OBJECT_ID('tempdb..#Customers') IS NOT NULL
  begin
  DROP TABLE #Customers
  end

CREATE TABLE #Customers(
IDCustomer INT IDENTITY(1,1),
    FirstName VARCHAR(50), 
    LastName  VARCHAR(50),
    PhoneNumber VARCHAR(10),
    EmailAddress VARCHAR(50),
    CreationDate DATETIME
)
--Llenamos MIL de datos
;WITH L0 AS (SELECT 1 c FROM(SELECT 1 UNION ALL SELECT 1)c(D)),
      L1 AS (SELECT 1 C FROM L0 CROSS JOIN L0 AS B),
      L2 AS (SELECT 1 C FROM L1 CROSS JOIN L1 AS B),
      L3 AS (SELECT 1 C FROM L2 CROSS JOIN L2 AS B),
      L4 AS (SELECT 1 C FROM L3 CROSS JOIN L3 AS B),
      L5 AS (SELECT 1 C FROM L4 CROSS JOIN L4 AS B),
      L6 AS (SELECT 1 C FROM L5 CROSS JOIN L5 AS B) --SUFICIENTE PARA UN MILLON

INSERT INTO #Customers (FirstName, LastName, PhoneNumber, EmailAddress, CreationDate)
SELECT TOP 1000 REPLACE(NEWID(),'-',''), REPLACE(NEWID(),'-',''), 
    CAST( CAST(ROUND(RAND(CHECKSUM(NEWID()))*1000000000+4000000000,0) AS BIGINT) AS VARCHAR(10)),
    REPLACE(NEWID(),'-','') + '@gmail.com',     
    DATEADD(HOUR,CAST(RAND(CHECKSUM(NEWID())) * 19999 as INT) + 1 ,'2006-01-01')
FROM L6




--DECLARACIÓN DE PARAMETROS PARA SABER QUE CAMPOS INCLUIR DE MANERA DINAMICA
DECLARE @IncludeFirstName BIT=1 ;
DECLARE @IncludeLastName BIT=0;
DECLARE @IncludePhoneNumber BIT=1;
DECLARE @IncludeEmailAddress BIT=0;


--DECLARAMOS UNA VARIABLE QUE TENDRA TODO

DECLARE @SQL NVARCHAR(MAX)='SELECT IDCustomer'


IF @IncludeFirstName=1 
SET @SQL=@SQL+' ,FirstName'

IF @IncludeLastName=1 
SET @SQL=@SQL+' ,LastName'

IF @IncludePhoneNumber=1 
SET @SQL=@SQL+' ,PhoneNumber'

IF @IncludeEmailAddress=1 
SET @SQL=@SQL+' ,EmailAddress'

--Despues de todas las validaciones agregamos el cuerpo

SET @SQL=@SQL+' 
FROM #Customers
'


--Al final ejecutamos la sentecia que hallamos formado

EXEC sp_executesql @SQL

я оставляю Тебе эту ссылку, где ты можешь видеть пример функционируя.

https://dbfiddle.uk/? rdbms=sqlserver_2017& fiddle=010e371db763502982b9ecfb5d00cf69

2
ответ дан 01.12.2019, 10:45

Я decantarГ - за query dinГЎmica tambiГ©n, я объясняю это тебе немного, но это то же самое, что сказал Эдгар

DECLARE @vcSQL NVARCHAR(MAX)='SELECT A.name,A.Code ' -- Ponemos aquí los atributos que se mostraran siempre ( ojo al espacio final)
IF(@COUNTRY IN ('Uruguay','Perú','Colombia')) -- No me gusta hardcodear pero aquí podrías poner el listado de Paises que provocan que se muestre la nueva columna
BEGIN
    SET @vcSQL = vcSQL+',A.Country '
END
SET @vcSQL = vcSQL+' FROM Table A WHERE...' -- Terminas de construir la query dinámica
EXEC sp_executesql @SQL -- La ejecutas 

, Если для тебя не имеет значения возвращать ее всегда, но sГіlo со стоимостью, когда будет выполнена одна condiciГіn определенная, ты можешь использовать case when в select

1
ответ дан 01.12.2019, 10:45

Протестируй это и ты говоришь мне как ты vГЎ

If Exists( Select A.Name From SysObjects A where A.Name = 'sp_iss_APIGetPatientList')
    Drop procedure sp_iss_APIGetPatientList
GO
Create Procedure sp_iss_APIGetPatientList
    @Country varchar(50)

AS
begin
    -- select A.name,A.Code,
   if @Country = 'Uruguay' begin

      -- add al select A.Country

      select A.name,A.Code,A.country 
      from  A
    -- Al final de todas las condiciones agregar:
      end



         --    from Table A
if @Country != 'Uruguay' begin

select A.name,A.Code from A


end

end

GO
0
ответ дан 01.12.2019, 10:45
  • 1
    Привет я не думаю, что это самое правильное, так как, если он имеет, мы сказали, что ты поместил бы 20 утверждений 20 раз той же консультации, но с различными параметрами – Edgar Vazquez 29.11.2019, 00:14
  • 2
    Так как для вопроса, который он задал, он не определил все утверждения Стран estarí в делая, в вышеупомянутом случае будьте много query cambiarí в полностью – Andres Delzo 29.11.2019, 16:29

Теги

Похожие вопросы