Pregunta

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 poder incluir dinámicamente la parte AND 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 SQL dinámica y ese es el problema. He intentado varios enfoques en vano. es posible? ¿SSRS 2005 soporta SQL dinámico? Gracias!

¿Fue útil?

Solución

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

Si @checked = 1 entonces evaluará la segunda parte del O y devolverá las filas que coincidan con col1 = 'ABC' AND col2 LIKE '% XYZ % '

Si tiene múltiples predicados condicionales, se pueden encadenar usando este método (mientras que los métodos IF y CASE rápidamente se volverán 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.

Otros consejos

¿Qué tal esto? @checked es tu variable de bit.

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.

Quizás esto funcione para ti:

if @checked = 1
    select * from mytable (nolock) where col = 'ABC'
else
    select * from mytable (nolock) where col = 'ABC' AND colw Like '%XYZ%'

Lo siento, no uso 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ías usar una declaración CASE WHEN.

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END

Esto funcionaría en SSRS 2000 pero se usaría como último recurso.

(mal) PSEUDOCODE

="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")

Echa un vistazo a Ejecutando " Dinámico " Consultas SQL . de la Guía del autostopista para SQL Server 2000 Reporting Services

Una forma de hacerlo es generar la consulta SSRS como una expresión. En el diseñador de informes de BIDS, configure su consulta de esta forma:

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
 Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")

si puede usar procedimientos almacenados, probablemente sea más fácil hacerlo allí. pasar en sus params Cree una cadena SQL basada en sus condiciones y ejecute un EXEC en la cadena sql, su proceso almacenado devolverá los resultados que necesita.

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  

Observe el uso de dos apóstrofes ' para marcar el texto citado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top