如何根据给定参数执行查询

时间:2018-07-12 18:50:03

标签: sql asp.net sql-server select

¡嗨!

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

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

{
  "name": "gulp.sass",
  "version": "1.0.0",
  "description": "Gulp, SASS + Slow running tasks",
  "main": "gulpfile.js",
  "scripts": {
    "start": "gulp"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "browser-sync": "^2.2.0",
    "gulp": "^3.8.11",
    "gulp-sass": "^1.3.3",
    "through2": "^0.6.3"
  }
}

我收到此错误:

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;

这两个查询的列结构均相同,但根据WHERE子句中的最后一条语句将呈现不同的数据。

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

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'.

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

该错误的原因是,您在一列中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 

答案 1 :(得分:2)

如果只有一个where条件不同,那么您将使用if-else条件编写冗余代码,因为查询几乎相同。将来将很难维护并且容易出现错误。您应该考虑删除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])
    )