【发布时间】: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