¿Podemos usar el resultado de una consulta de selección como condición para encontrar los registros?

primero tengo que encontrar el nombre del agente de la tabla de consulta si el nombre del agente se encuentra, entonces si la parte funcionará y si el nombre del agente no se encuentra, la segunda consulta es otra parte que funcionará. A continuación se muestra mi consulta, por favor, hágame saber dónde me equivoco. Gracias por adelantado

create proc ConfirmationMail_ToAgent
(
    @Enquiry_Id nvarchar(50)
)
as
begin
    select Agent_Name from Enquiry where Enquiry_Id = @Enquiry_Id as jh
    if(jh != 'Select')
    begin
        select e.Agent_Name,e.Agent_Email,e.Client_Name,e.Handled_By,ef.EMail_Id from Enquiry e inner join Employee_FullDetail ef on e.Handled_By = ef.First_Name where e.Enquiry_Id = @Enquiry_Id
    end
    else
    begin
       select e.Client_Name,e.Client_Address,e.Handled_By,ef.EMail_Id from Enquiry e inner join Employee_FullDetail ef on e.Handled_By = ef.First_Name where e.Enquiry_Id = @Enquiry_Id
    end
end

preguntado el 21 de septiembre de 13 a las 12:09

2 Respuestas

In SQL Server, asigna la columna a una variable usando la siguiente sintaxis

DECLARE @Var varchar(xx)
SELECT @Var = [ColName] FROM [TableName]

Entonces su consulta debería verse así:

create proc ConfirmationMail_ToAgent
(
@Enquiry_Id nvarchar(50)
)
as
BEGIN
    DECLARE @jh VARCHAR(100)
    select @jh= Agent_Name from Enquiry where Enquiry_Id = @Enquiry_Id 
    if(@jh != 'Select')
    begin
        select e.Agent_Name,e.Agent_Email,e.Client_Name,e.Handled_By,ef.EMail_Id from Enquiry e inner join Employee_FullDetail ef on e.Handled_By = ef.First_Name where e.Enquiry_Id = @Enquiry_Id
    end
    else
    begin
        select e.Client_Name,e.Client_Address,e.Handled_By,ef.EMail_Id from Enquiry e inner join Employee_FullDetail ef on e.Handled_By = ef.First_Name where e.Enquiry_Id = @Enquiry_Id
    end
end

Respondido el 21 de Septiembre de 13 a las 12:09

¿Y comprobó que el @jh a veces obtiene valor? Select. Te sugiero que insertes select @jh as jh justo antes if(... para comprobar que recibe el Select - luis ll

ahora la consulta funciona, pero ¿por qué esta consulta devuelve el mismo valor dos veces? Cocina

¿qué quieres decir? ¿Está enviando valores diferentes cada vez y Agent_Name es diferente? - luis ll

no, esta es la ejecución del procedimiento exec ConfirmationMail_ToAgent 'RH - 02/09/2013 - 2' y debajo aparece el resultado: Cocina

no, este es el procedimiento de ejecución exec ConfirmationMail_ToAgent 'RH - 02/09/2013 - 2' y debajo aparece el resultado Ish Travels packages@ishtravels.com Shiv Paul paul@roverholidays.com Ish Travels packages@ishtravels.com Shiv Paul paul@roverholidays .com- Cocina

Bueno, realmente creo que tienes que leer sobre Principio DRY en la programación. Siga este principio y le ayudará a mantener su código en el futuro. Parece que no necesita 2 consultas aquí, solo puede usar una:

create proc ConfirmationMail_ToAgent
(
     @Enquiry_Id nvarchar(50)
)
as
begin
    select
        case when e.Agent_Name != 'Select' then e.Agent_Name else e.Client_Name end as Name,
        case when e.Agent_Name != 'Select' then e.Agent_Email else e.Client_Address end as Address,
        e.Handled_By, ef.EMail_Id
    from Enquiry as e
        inner join Employee_FullDetail as ef on ef.First_Name = e.Handled_By
    where e.Enquiry_Id = @Enquiry_Id
end

este será más fácil de mantener - si tiene que agregar columnas al conjunto de resultados, lo hace solo una vez, más fácil de leer - no tienes que pensar en - ¿cuál es la diferencia en estas 2 consultas? Para seguir completamente el principio DRY, esta consulta podría reescribirse, por ejemplo, así:

create proc ConfirmationMail_ToAgent
(
     @Enquiry_Id nvarchar(50)
)
as
begin
    select
        C.Name, C.Email,
        e.Client_Name, e.Handled_By, ef.EMail_Id
    from Enquiry as e
        inner join Employee_FullDetail as ef on ef.First_Name = e.Handled_By
        outer apply ( 
            select e.Agent_Name, e.Agent_Email where e.Agent_Name != 'Select' union all
            select e.Client_Name, e.Client_Address where e.Agent_Name == 'Select'
        ) as C(Name, Email)
    where e.Enquiry_Id = @Enquiry_Id
end

Respondido el 21 de Septiembre de 13 a las 16:09

LA consulta ANTERIOR está funcionando con la condición where, pero qué hacer si quiero la misma consulta sin ninguna condición where significa que quiero buscar cada registro si obtengo el nombre del agente, entonces el resultado será el nombre del agente y si obtengo el nombre del agente como seleccionar o anular el resultado será el nombre del cliente por favor ayúdenme a resolver el problema gracias por adelantado para obtener ayuda - Cocina

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.