sql-server - name - reporting services parameters
SSRS: Cambia la declaración de SQL dinámicamente (8)
Charles casi tuvo la respuesta correcta.
Debería ser:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = ''ABC''
AND (@checked = 0 OR col2 LIKE ''%XYZ%'')
Este es un "patrón" clásico en SQL para predicados condicionales. Si @checked = 0
, devolverá todas las filas que coincidan con el resto del predicado ( col1 = ''ABC''
). SQL Server ni siquiera procesará la segunda mitad del OR
.
Si @checked = 1
, evaluará la segunda parte del OR
y devolverá las filas que coincidan con col1 = ''ABC'' AND col2 LIKE ''%XYZ%''
Si tiene múltiples predicados condicionales, pueden encadenarse utilizando este método (mientras que los métodos IF y CASE se volverían rápidamente inmanejables).
Por ejemplo:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = ''ABC''
AND (@checked1 = 0 OR col2 LIKE ''%XYZ%'')
AND (@checked2 = 0 OR col3 LIKE ''%MNO%'')
No use SQL dinámico, no use IF o CASE.
Tengo un informe en SSRS 2005 que se basa en una consulta similar a esta:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = ''ABC''
AND col2 LIKE ''%XYZ%''
Necesito ser capaz de incluir dinámicamente la parte Y de la cláusula WHERE en la consulta en función de si el usuario ha marcado una casilla de verificación. Básicamente, esta es una declaración de SQL dinámico y ese es el problema. Probé varios enfoques sin resultado. es posible? ¿SSRS 2005 es compatible con SQL dinámico? ¡Gracias!
Esto funcionaría en SSRS 2000 pero se usó como último recurso.
(mal) PSEUDOCODE
="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = ''ABC''"+
iff(condition,true,"AND col2 LIKE ''%XYZ%''","")
Consulte Ejecutar consultas SQL "dinámicas" . de la Guía del autoestopista de SQL Server 2000 Reporting Services
Qué tal esto. @checked es su bit variable.
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = ''ABC''
AND (@checked <> 0 and col2 LIKE ''%XYZ%'')
Editar: Además, si no está utilizando un proceso almacenado, entonces use uno.
Tal vez esto funcione para usted:
if @checked = 1
select * from mytable (nolock) where col = ''ABC''
else
select * from mytable (nolock) where col = ''ABC'' AND colw Like ''%XYZ%''
Lamento no utilizar mucho SSRS, pero si puede obtener el valor de la casilla de verificación en el parámetro @checked esto debería funcionar.
Alternativamente, podría usar una sentencia CASE WHEN.
Una forma de hacerlo es generando la consulta de SSRS como una expresión. En el diseñador de informes BIDS, configure su consulta de la siguiente manera:
="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = ''ABC''" +
Iif(Parameters!Checked.Value = true," AND col2 LIKE ''%XYZ%''","")
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = ''ABC''
AND col2 LIKE CASE @checked WHEN 1 THEN ''%XYZ%'' ELSE col2 END
También puede tomar otro enfoque y usar la función Exec:
DECLARE @CommonSelectText varchar(2000)
DECLARE @CompleteSelectText varchar(2000)
SELECT @CommonSelectText = ''SELECT * FROM MyTable (nolock) Where Col = ''''ABC'''' ''
IF @checked = 1
SELECT @CompleteSelectText = @CommonSelectText + '' AND ColW LIKE ''''%XYZ%'''' ''
ELSE
SELECT @CompleteSelectText = @CommonSelectText
EXEC (@CompleteSelectText)
GO
Tenga en cuenta el uso de dos apóstrofes para marcar el texto citado.
si puede usar procedimientos almacenados, probablemente sea más fácil hacerlo allí. pasa tus params. Cree una cadena SQL en función de sus condiciones y realice un EXEC en la cadena sql, su proceso almacenado le devolverá los resultados que necesita.