【问题标题】:How to execute a query according to a given parameter如何根据给定的参数执行查询
【发布时间】:2018-12-21 02:16:16
【问题描述】:

¡嗨!

我正在尝试构建一个查询,该查询将根据特定参数填充数据集 (GridView)。所以如果参数为 1 则执行 SELECT 语句 A,如果为 2 则执行 SELECT 语句 B。

到目前为止,这是我的代码:

DECLARE @p varchar(20) = '2018-02'
DECLARE @f1 int = 1
DECLARE @f3 int = 1

SELECT
    CASE
        WHEN @f3 = 1
        THEN
            (
                SELECT
                    [dbo].[N_Preinscripcion].[ID],
                    [dbo].[N_Sedes].[Sede] AS [SedePrint],
                    [dbo].[N_Preinscripcion].[Nombre] + ' ' + [dbo].[N_Preinscripcion].[Apellido] AS [NombrePrint],
                    CASE
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '1' THEN 'TI-' + [dbo].[N_Preinscripcion].[DocIdentidad]  
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '2' THEN 'CC-' + [dbo].[N_Preinscripcion].[DocIdentidad]
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '3' THEN 'CE-' + [dbo].[N_Preinscripcion].[DocIdentidad]
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '4' THEN 'PP-' + [dbo].[N_Preinscripcion].[DocIdentidad]
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '5' THEN 'OT-' + [dbo].[N_Preinscripcion].[DocIdentidad]
                    END AS [TipoDocIdentidadPrint],
                    [dbo].[N_Programas_Master].[Nombre] AS [Programa],
                    SUBSTRING([dbo].[N_Programas_Master].[Nombre], 0, CHARINDEX('-', [dbo].[N_Programas_Master].[Nombre])) AS [ProgramaPln],
                    [dbo].[N_Programas_Tipos].[Tipo],    
                    [dbo].[N_Preinscripcion].[CodigoTemporal],
                    CASE
                        WHEN 
                            (
                                SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])   
                            ) = 0
                        THEN '<article style="color: rgb(237,27,47)"><i class="fa fa-ban" aria-hidden="true"></i> Sin activar</article>'
                        ELSE '<article style="color: rgb(121,162,68)"><i class="fa fa-user" aria-hidden="true"></i> Activada</article>'
                    END AS [EstadoCuenta],
                    CASE
                        WHEN [dbo].[N_Preinscripcion].[Revisado1] = 'False' THEN '<article style="color: rgb(121,162,68)"><i class="fa fa-folder-open-o" aria-hidden="true"></i> Nuevo</article>' 
                        WHEN [dbo].[N_Preinscripcion].[Revisado1] = 'True' THEN '<article style="color: rgb(15,134,137)"><i class="fa fa-folder-open" aria-hidden="true"></i> Revisado</article>' 
                    END AS [Revisado1Print],
                    [dbo].[EstadosAdmision].[Icono] + ' ' + [dbo].[EstadosAdmision].[Estado] AS [EstadoAdm],  
                    CONVERT(varchar(200), [dbo].[N_Preinscripcion].[FechaEnv], 106) AS [Fecha],  
                    '<a href="inscripciones-detalles.aspx?sklid=' + CONVERT(varchar(max), [dbo].[N_Preinscripcion].[ID]) + '">Detalles</a>' AS [AClink],
                    CASE
                        WHEN (SELECT COUNT(*) FROM [dbo].[N_Seguimiento_Preinsc] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID])) = '0'
                        THEN '<span class="textoRojoSm"><i class="fa fa-ban fa-fw"></i> N/A</span>'
                        ELSE '<span class="textoVerdeSm"><i class="fa fa-check fa-fw"></i>(' 
                                + 
                                    CONVERT
                                        (varchar(200), 
                                            (
                                                SELECT COUNT(*) FROM [dbo].[N_Seguimiento_Preinsc] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID])
                                            )
                                        ) 
                                + ')</span>'
                                + ' <div class="tooltip">' + (SELECT TOP(1) [dbo].[N_Insc_EstadosSeguimiento].[Codigo] FROM [dbo].[N_Seguimiento_Preinsc] INNER JOIN [dbo].[N_Insc_EstadosSeguimiento] ON [dbo].[N_Insc_EstadosSeguimiento].[ID] = [dbo].[N_Seguimiento_Preinsc].[Codigo] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID]) ORDER BY [dbo].[N_Seguimiento_Preinsc].[ID] DESC) + '<span class="tooltiptext">' + (SELECT TOP(1) [dbo].[N_Seguimiento_Preinsc].[Comentario] + CONVERT(varchar(50), [dbo].[N_Seguimiento_Preinsc].[FechaEnv]) FROM [dbo].[N_Seguimiento_Preinsc] INNER JOIN [dbo].[N_Insc_EstadosSeguimiento] ON [dbo].[N_Insc_EstadosSeguimiento].[ID] = [dbo].[N_Seguimiento_Preinsc].[Codigo] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID]) ORDER BY [dbo].[N_Seguimiento_Preinsc].[ID] DESC) + '</span></div>'
                    END AS [Seguimiento]   
                FROM [dbo].[N_Preinscripcion]

                INNER JOIN
                    [dbo].[N_Programas_Master] 
                    ON [dbo].[N_Programas_Master].[ID] = [dbo].[N_Preinscripcion].[IdPrograma] 

                INNER JOIN
                    [dbo].[N_Programas_Tipos] 
                    ON [dbo].[N_Programas_Tipos].[ID] = [dbo].[N_Programas_Master].[Tipo] 

                INNER JOIN
                    [dbo].[EstadosAdmision] 
                    ON [dbo].[N_Preinscripcion].[Estado] = [dbo].[EstadosAdmision].[ID]       

                INNER JOIN
                    [dbo].[N_Sedes]
                    ON [dbo].[N_Sedes].[ID] = [dbo].[N_Preinscripcion].[Sede]

                WHERE
                    ([dbo].[N_Preinscripcion].[Periodo] = @p) 
                    AND
                    ([dbo].[N_Preinscripcion].[Sede] = @f1)
                    AND
                    ((SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])) > 0)

                ORDER BY
                    [dbo].[N_Preinscripcion].[ID] DESC,
                    [dbo].[N_Preinscripcion].[Apellido] ASC,
                    [dbo].[N_Preinscripcion].[Nombre] ASC
        )
    ELSE
        (
            SELECT
                    [dbo].[N_Preinscripcion].[ID],
                    [dbo].[N_Sedes].[Sede] AS [SedePrint],
                    [dbo].[N_Preinscripcion].[Nombre] + ' ' + [dbo].[N_Preinscripcion].[Apellido] AS [NombrePrint],
                    CASE
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '1' THEN 'TI-' + [dbo].[N_Preinscripcion].[DocIdentidad]  
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '2' THEN 'CC-' + [dbo].[N_Preinscripcion].[DocIdentidad]
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '3' THEN 'CE-' + [dbo].[N_Preinscripcion].[DocIdentidad]
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '4' THEN 'PP-' + [dbo].[N_Preinscripcion].[DocIdentidad]
                        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '5' THEN 'OT-' + [dbo].[N_Preinscripcion].[DocIdentidad]
                    END AS [TipoDocIdentidadPrint],
                    [dbo].[N_Programas_Master].[Nombre] AS [Programa],
                    SUBSTRING([dbo].[N_Programas_Master].[Nombre], 0, CHARINDEX('-', [dbo].[N_Programas_Master].[Nombre])) AS [ProgramaPln],
                    [dbo].[N_Programas_Tipos].[Tipo],    
                    [dbo].[N_Preinscripcion].[CodigoTemporal],
                    CASE
                        WHEN 
                            (
                                SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])   
                            ) = 0
                        THEN '<article style="color: rgb(237,27,47)"><i class="fa fa-ban" aria-hidden="true"></i> Sin activar</article>'
                        ELSE '<article style="color: rgb(121,162,68)"><i class="fa fa-user" aria-hidden="true"></i> Activada</article>'
                    END AS [EstadoCuenta],
                    CASE
                        WHEN [dbo].[N_Preinscripcion].[Revisado1] = 'False' THEN '<article style="color: rgb(121,162,68)"><i class="fa fa-folder-open-o" aria-hidden="true"></i> Nuevo</article>' 
                        WHEN [dbo].[N_Preinscripcion].[Revisado1] = 'True' THEN '<article style="color: rgb(15,134,137)"><i class="fa fa-folder-open" aria-hidden="true"></i> Revisado</article>' 
                    END AS [Revisado1Print],
                    [dbo].[EstadosAdmision].[Icono] + ' ' + [dbo].[EstadosAdmision].[Estado] AS [EstadoAdm],  
                    CONVERT(varchar(200), [dbo].[N_Preinscripcion].[FechaEnv], 106) AS [Fecha],  
                    '<a href="inscripciones-detalles.aspx?sklid=' + CONVERT(varchar(max), [dbo].[N_Preinscripcion].[ID]) + '">Detalles</a>' AS [AClink],
                    CASE
                        WHEN (SELECT COUNT(*) FROM [dbo].[N_Seguimiento_Preinsc] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID])) = '0'
                        THEN '<span class="textoRojoSm"><i class="fa fa-ban fa-fw"></i> N/A</span>'
                        ELSE '<span class="textoVerdeSm"><i class="fa fa-check fa-fw"></i>(' 
                                + 
                                    CONVERT
                                        (varchar(200), 
                                            (
                                                SELECT COUNT(*) FROM [dbo].[N_Seguimiento_Preinsc] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID])
                                            )
                                        ) 
                                + ')</span>'
                                + ' <div class="tooltip">' + (SELECT TOP(1) [dbo].[N_Insc_EstadosSeguimiento].[Codigo] FROM [dbo].[N_Seguimiento_Preinsc] INNER JOIN [dbo].[N_Insc_EstadosSeguimiento] ON [dbo].[N_Insc_EstadosSeguimiento].[ID] = [dbo].[N_Seguimiento_Preinsc].[Codigo] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID]) ORDER BY [dbo].[N_Seguimiento_Preinsc].[ID] DESC) + '<span class="tooltiptext">' + (SELECT TOP(1) [dbo].[N_Seguimiento_Preinsc].[Comentario] + CONVERT(varchar(50), [dbo].[N_Seguimiento_Preinsc].[FechaEnv]) FROM [dbo].[N_Seguimiento_Preinsc] INNER JOIN [dbo].[N_Insc_EstadosSeguimiento] ON [dbo].[N_Insc_EstadosSeguimiento].[ID] = [dbo].[N_Seguimiento_Preinsc].[Codigo] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID]) ORDER BY [dbo].[N_Seguimiento_Preinsc].[ID] DESC) + '</span></div>'
                    END AS [Seguimiento]   
                FROM [dbo].[N_Preinscripcion]

                INNER JOIN
                    [dbo].[N_Programas_Master] 
                    ON [dbo].[N_Programas_Master].[ID] = [dbo].[N_Preinscripcion].[IdPrograma] 

                INNER JOIN
                    [dbo].[N_Programas_Tipos] 
                    ON [dbo].[N_Programas_Tipos].[ID] = [dbo].[N_Programas_Master].[Tipo] 

                INNER JOIN
                    [dbo].[EstadosAdmision] 
                    ON [dbo].[N_Preinscripcion].[Estado] = [dbo].[EstadosAdmision].[ID]       

                INNER JOIN
                    [dbo].[N_Sedes]
                    ON [dbo].[N_Sedes].[ID] = [dbo].[N_Preinscripcion].[Sede]

                WHERE
                    ([dbo].[N_Preinscripcion].[Periodo] = @p) 
                    AND
                    ([dbo].[N_Preinscripcion].[Sede] = @f1)
                    AND
                    ((SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])) = 0)

                ORDER BY
                    [dbo].[N_Preinscripcion].[ID] DESC,
                    [dbo].[N_Preinscripcion].[Apellido] ASC,
                    [dbo].[N_Preinscripcion].[Nombre] ASC
        )
    END;

我收到此错误:

Msg 1033, Level 15, State 1, Line 84
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.
Msg 156, Level 15, State 1, Line 156
Incorrect syntax near the keyword 'ORDER'.

两个查询在列中具有相同的表结构,但会根据 WHERE 子句中的最后一条语句呈现不同的数据。

因此,如果参数@f3 = 1,则该语句将是:

((SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])) > 0)

如果@f3 = 2,则该语句将是:

((SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])) = 0)

谢谢!

【问题讨论】:

  • 这里要非常小心。你正在制造一个性能定时炸弹。您正在尝试实现所谓的多执行路径。您可以做一些事情来提供帮助,但您需要知道如何正确处理它。幸运的是,Gail Shaw 在这里有一个很棒的博客。 sqlinthewild.co.za/index.php/2009/09/15/…

标签: sql asp.net sql-server select


【解决方案1】:

错误是因为,You select 一列中有多个列。

你可以试试IF,而不是CASE WHEN

IF  (@f3 = 1)
BEGIN
    SELECT
    [dbo].[N_Preinscripcion].[ID],
    [dbo].[N_Sedes].[Sede] AS [SedePrint],
    [dbo].[N_Preinscripcion].[Nombre] + ' ' + [dbo].[N_Preinscripcion].[Apellido] AS [NombrePrint],
    CASE
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '1' THEN 'TI-' + [dbo].[N_Preinscripcion].[DocIdentidad]  
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '2' THEN 'CC-' + [dbo].[N_Preinscripcion].[DocIdentidad]
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '3' THEN 'CE-' + [dbo].[N_Preinscripcion].[DocIdentidad]
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '4' THEN 'PP-' + [dbo].[N_Preinscripcion].[DocIdentidad]
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '5' THEN 'OT-' + [dbo].[N_Preinscripcion].[DocIdentidad]
    END AS [TipoDocIdentidadPrint],
    [dbo].[N_Programas_Master].[Nombre] AS [Programa],
    SUBSTRING([dbo].[N_Programas_Master].[Nombre], 0, CHARINDEX('-', [dbo].[N_Programas_Master].[Nombre])) AS [ProgramaPln],
    [dbo].[N_Programas_Tipos].[Tipo],    
    [dbo].[N_Preinscripcion].[CodigoTemporal],
    CASE
        WHEN 
            (
                SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])   
            ) = 0
        THEN '<article style="color: rgb(237,27,47)"><i class="fa fa-ban" aria-hidden="true"></i> Sin activar</article>'
        ELSE '<article style="color: rgb(121,162,68)"><i class="fa fa-user" aria-hidden="true"></i> Activada</article>'
    END AS [EstadoCuenta],
    CASE
        WHEN [dbo].[N_Preinscripcion].[Revisado1] = 'False' THEN '<article style="color: rgb(121,162,68)"><i class="fa fa-folder-open-o" aria-hidden="true"></i> Nuevo</article>' 
        WHEN [dbo].[N_Preinscripcion].[Revisado1] = 'True' THEN '<article style="color: rgb(15,134,137)"><i class="fa fa-folder-open" aria-hidden="true"></i> Revisado</article>' 
    END AS [Revisado1Print],
    [dbo].[EstadosAdmision].[Icono] + ' ' + [dbo].[EstadosAdmision].[Estado] AS [EstadoAdm],  
    CONVERT(varchar(200), [dbo].[N_Preinscripcion].[FechaEnv], 106) AS [Fecha],  
    '<a href="inscripciones-detalles.aspx?sklid=' + CONVERT(varchar(max), [dbo].[N_Preinscripcion].[ID]) + '">Detalles</a>' AS [AClink],
    CASE
        WHEN (SELECT COUNT(*) FROM [dbo].[N_Seguimiento_Preinsc] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID])) = '0'
        THEN '<span class="textoRojoSm"><i class="fa fa-ban fa-fw"></i> N/A</span>'
        ELSE '<span class="textoVerdeSm"><i class="fa fa-check fa-fw"></i>(' 
                + 
                    CONVERT
                        (varchar(200), 
                            (
                                SELECT COUNT(*) FROM [dbo].[N_Seguimiento_Preinsc] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID])
                            )
                        ) 
                + ')</span>'
                + ' <div class="tooltip">' + (SELECT TOP(1) [dbo].[N_Insc_EstadosSeguimiento].[Codigo] FROM [dbo].[N_Seguimiento_Preinsc] INNER JOIN [dbo].[N_Insc_EstadosSeguimiento] ON [dbo].[N_Insc_EstadosSeguimiento].[ID] = [dbo].[N_Seguimiento_Preinsc].[Codigo] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID]) ORDER BY [dbo].[N_Seguimiento_Preinsc].[ID] DESC) + '<span class="tooltiptext">' + (SELECT TOP(1) [dbo].[N_Seguimiento_Preinsc].[Comentario] + CONVERT(varchar(50), [dbo].[N_Seguimiento_Preinsc].[FechaEnv]) FROM [dbo].[N_Seguimiento_Preinsc] INNER JOIN [dbo].[N_Insc_EstadosSeguimiento] ON [dbo].[N_Insc_EstadosSeguimiento].[ID] = [dbo].[N_Seguimiento_Preinsc].[Codigo] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID]) ORDER BY [dbo].[N_Seguimiento_Preinsc].[ID] DESC) + '</span></div>'
    END AS [Seguimiento]   
    FROM [dbo].[N_Preinscripcion]

    INNER JOIN
    [dbo].[N_Programas_Master] 
    ON [dbo].[N_Programas_Master].[ID] = [dbo].[N_Preinscripcion].[IdPrograma] 

    INNER JOIN
    [dbo].[N_Programas_Tipos] 
    ON [dbo].[N_Programas_Tipos].[ID] = [dbo].[N_Programas_Master].[Tipo] 

    INNER JOIN
    [dbo].[EstadosAdmision] 
    ON [dbo].[N_Preinscripcion].[Estado] = [dbo].[EstadosAdmision].[ID]       

    INNER JOIN
    [dbo].[N_Sedes]
    ON [dbo].[N_Sedes].[ID] = [dbo].[N_Preinscripcion].[Sede]

    WHERE
    ([dbo].[N_Preinscripcion].[Periodo] = @p) 
    AND
    ([dbo].[N_Preinscripcion].[Sede] = @f1)
    AND
    ((SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])) > 0)

    ORDER BY
    [dbo].[N_Preinscripcion].[ID] DESC,
    [dbo].[N_Preinscripcion].[Apellido] ASC,
    [dbo].[N_Preinscripcion].[Nombre] ASC
END 
ELSE 
BEGIN 
    SELECT
        [dbo].[N_Preinscripcion].[ID],
        [dbo].[N_Sedes].[Sede] AS [SedePrint],
        [dbo].[N_Preinscripcion].[Nombre] + ' ' + [dbo].[N_Preinscripcion].[Apellido] AS [NombrePrint],
    CASE
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '1' THEN 'TI-' + [dbo].[N_Preinscripcion].[DocIdentidad]  
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '2' THEN 'CC-' + [dbo].[N_Preinscripcion].[DocIdentidad]
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '3' THEN 'CE-' + [dbo].[N_Preinscripcion].[DocIdentidad]
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '4' THEN 'PP-' + [dbo].[N_Preinscripcion].[DocIdentidad]
        WHEN [dbo].[N_Preinscripcion].[TipoDocIdentidad] = '5' THEN 'OT-' + [dbo].[N_Preinscripcion].[DocIdentidad]
    END AS [TipoDocIdentidadPrint],
    [dbo].[N_Programas_Master].[Nombre] AS [Programa],
    SUBSTRING([dbo].[N_Programas_Master].[Nombre], 0, CHARINDEX('-', [dbo].[N_Programas_Master].[Nombre])) AS [ProgramaPln],
    [dbo].[N_Programas_Tipos].[Tipo],    
    [dbo].[N_Preinscripcion].[CodigoTemporal],
    CASE
        WHEN 
            (
                SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])   
            ) = 0
        THEN '<article style="color: rgb(237,27,47)"><i class="fa fa-ban" aria-hidden="true"></i> Sin activar</article>'
        ELSE '<article style="color: rgb(121,162,68)"><i class="fa fa-user" aria-hidden="true"></i> Activada</article>'
    END AS [EstadoCuenta],
    CASE
        WHEN [dbo].[N_Preinscripcion].[Revisado1] = 'False' THEN '<article style="color: rgb(121,162,68)"><i class="fa fa-folder-open-o" aria-hidden="true"></i> Nuevo</article>' 
        WHEN [dbo].[N_Preinscripcion].[Revisado1] = 'True' THEN '<article style="color: rgb(15,134,137)"><i class="fa fa-folder-open" aria-hidden="true"></i> Revisado</article>' 
    END AS [Revisado1Print],
    [dbo].[EstadosAdmision].[Icono] + ' ' + [dbo].[EstadosAdmision].[Estado] AS [EstadoAdm],  
    CONVERT(varchar(200), [dbo].[N_Preinscripcion].[FechaEnv], 106) AS [Fecha],  
    '<a href="inscripciones-detalles.aspx?sklid=' + CONVERT(varchar(max), [dbo].[N_Preinscripcion].[ID]) + '">Detalles</a>' AS [AClink],
    CASE
        WHEN (SELECT COUNT(*) FROM [dbo].[N_Seguimiento_Preinsc] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID])) = '0'
        THEN '<span class="textoRojoSm"><i class="fa fa-ban fa-fw"></i> N/A</span>'
        ELSE '<span class="textoVerdeSm"><i class="fa fa-check fa-fw"></i>(' 
                + 
                    CONVERT
                        (varchar(200), 
                            (
                                SELECT COUNT(*) FROM [dbo].[N_Seguimiento_Preinsc] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID])
                            )
                        ) 
                + ')</span>'
                + ' <div class="tooltip">' + (SELECT TOP(1) [dbo].[N_Insc_EstadosSeguimiento].[Codigo] FROM [dbo].[N_Seguimiento_Preinsc] INNER JOIN [dbo].[N_Insc_EstadosSeguimiento] ON [dbo].[N_Insc_EstadosSeguimiento].[ID] = [dbo].[N_Seguimiento_Preinsc].[Codigo] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID]) ORDER BY [dbo].[N_Seguimiento_Preinsc].[ID] DESC) + '<span class="tooltiptext">' + (SELECT TOP(1) [dbo].[N_Seguimiento_Preinsc].[Comentario] + CONVERT(varchar(50), [dbo].[N_Seguimiento_Preinsc].[FechaEnv]) FROM [dbo].[N_Seguimiento_Preinsc] INNER JOIN [dbo].[N_Insc_EstadosSeguimiento] ON [dbo].[N_Insc_EstadosSeguimiento].[ID] = [dbo].[N_Seguimiento_Preinsc].[Codigo] WHERE([dbo].[N_Seguimiento_Preinsc].[IdPre] = [dbo].[N_Preinscripcion].[ID]) ORDER BY [dbo].[N_Seguimiento_Preinsc].[ID] DESC) + '</span></div>'
    END AS [Seguimiento]   
    FROM [dbo].[N_Preinscripcion]

    INNER JOIN
    [dbo].[N_Programas_Master] 
    ON [dbo].[N_Programas_Master].[ID] = [dbo].[N_Preinscripcion].[IdPrograma] 

    INNER JOIN
    [dbo].[N_Programas_Tipos] 
    ON [dbo].[N_Programas_Tipos].[ID] = [dbo].[N_Programas_Master].[Tipo] 

    INNER JOIN
    [dbo].[EstadosAdmision] 
    ON [dbo].[N_Preinscripcion].[Estado] = [dbo].[EstadosAdmision].[ID]       

    INNER JOIN
    [dbo].[N_Sedes]
    ON [dbo].[N_Sedes].[ID] = [dbo].[N_Preinscripcion].[Sede]

    WHERE
    ([dbo].[N_Preinscripcion].[Periodo] = @p) 
    AND
    ([dbo].[N_Preinscripcion].[Sede] = @f1)
    AND
    ((SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])) = 0)

    ORDER BY
    [dbo].[N_Preinscripcion].[ID] DESC,
    [dbo].[N_Preinscripcion].[Apellido] ASC,
    [dbo].[N_Preinscripcion].[Nombre] ASC
END 

【讨论】:

    【解决方案2】:

    如果只有一个where 条件不同,那么您正在使用if-else 条件编写冗余代码,因为查询几乎相同。以后会很难维护,容易出bug。您应该考虑删除 if-else 条件并使用单个查询处理 where 子句中的 @f3 条件。更新后的where 子句的最后一条语句如下所示。

    删除此语句-

            ((SELECT COUNT(*) FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])) = 0)
    

    并将其替换为以下条件

            (@f3=1 and  exists (SELECT 1 FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])
            OR
            (@f3=0 and  not exists (SELECT 1 FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])
    

    您的最终 Where 子句将如下所示 -

    WHERE
        ([dbo].[N_Preinscripcion].[Periodo] = @p) 
        AND
        ([dbo].[N_Preinscripcion].[Sede] = @f1)
        AND
        (   (@f3=1 and  exists (SELECT 1 FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])
            OR
            (@f3=0 and  not exists (SELECT 1 FROM [dbo].[aspnet_Users] WHERE([dbo].[aspnet_Users].[UserName] = [dbo].[N_Preinscripcion].[DocIdentidad])
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 2021-06-22
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多