Diferencias entre datos para consultas

Preguntado hace 1 año

MaLKaV_eS
Editado hace 1 año
Votos
PositivosNegativosTotal
2 0 2
66 Visualizaciones
Compártelo: Compártelo en twitterCompártelo en Facebook

Buenas,

Tengo un pequeño problema con unas consultas en SqlServer. Tengo ahora mismo una tabla con los mismos datos en el entorno de pruebas y en el de producción. Y he descubierto que para una misma consulta (extraida con el profiler de sqlserver), hay una diferencia de 10 datos, devolviendo menos cuando se ejecuta en producción.

Consultados estos 10, tienen exactamente los mismos valores y deberían devolverse con la consulta inicial.

La única diferencia real que hay es que el entorno de test es 2005 y producción 2008.

¿Alguna idea sobre que puede estar pasando?

Edito para que salga la consulta:

exec sp_executesql N'SELECT campo_nvarchar FROM dbo.TABLA where fid = @fid
AND CONTAINS(t,@t) AND CONTAINS(c,@c) AND (CONTAINS(v1, @v1) 
OR CONTAINS(v2, @v2))',
N'@fid bigint,@t nvarchar(5),@c nvarchar(124),@v1 nvarchar(1130),@v2 nvarchar(1121)',
@fid=BIGINT,@t=N'"STRING"',@c=N'STRING',@v1=N'STRING',@v2=N'STRING'

La única particularidad de la consulta, es que tanto c como v1 y v2, son parametros del CONTAINS, y van con este formato: "V1" OR "V2" OR ... "Vn".

UPDATE: Bueno, he visto que los valores que se recuperan mal son los de v1 o v2 que se cumplen más de una vez para el mismo (es decir, en el campo v hay más de un valor de v1 o v2). Salvo un campo, que se devuelve en los dos y se cumple cuatro veces...

UPDATE2: Pues no he encontrado que era lo que fallaba, pero hemos conseguido solucionarlo recurriendo a una tabla diferente con los datos dispuestos de otra forma. ¡Muchas gracias!

Actualizando datos
Actualizado con la consulta. ¿Hay alguna forma de ponerla en varias lineas? MaLKaV_eS hace 1 año
Hola, MaLKaV_eS, parece que las interpreta distinto... ¿es posible ver el código para ver qué es lo que interpreta distinto? Gabriel Molina hace 1 año

4 Respuestas

Hace 1 año

Gabriel Molina
Votos
PositivosNegativosTotal
101

Otro intento, a ver si a la tercera... :)

Creo que con esto puedes comprobarlo (no tengo el entorno searchindex montado)

select * from sys.fulltext_languages
  • Contains da un valor númerico entre 0.0 y 1.0, si especificas un límite puedes tratar de ver si está dando valores distintos en un servidor y en otro. Igual poniendo 0.1 puedes verlos todos... en el 2008. Si es así y vas subiendo el número (0.2,0.3,0.4...). Igual el algoritmo que calcula el numerito de marras no da el mismo número para el mismo caso.
Cerrar

Esta no he podido probarla. Si consigo sacar tiempo para mirarlo te digo. MaLKaV_eS hace 1 año

Hace 1 año

Gabriel Molina
Editada hace 1 año
Votos
PositivosNegativosTotal
101

A ver si lo pillamos :)

Se me ocurren más pruebas, veo lo del AND y el OR pero con los paréntesis parece que deberían funcionar del mismo modo:

SELECT campo_nvarchar 
FROM dbo.TABLA 
    where fid = @fid        
        AND (CONTAINS(v1, @v1) 
            OR CONTAINS(v2, @v2))


SELECT campo_nvarchar 
FROM dbo.TABLA 
    where (CONTAINS(v1, @v1) AND fid = @fid)
            OR (CONTAINS(v2, @v2) AND fid = @fid)

Otra sería enlazar el servidor de pruebas con el real y lanzar la consulta desde el de pruebas y ver qué resultados da.

EXEC sp_addlinkedserver
@server = ‘produccion’,@srvproduct =’Entorno produccion’,
@provider = MSDASQL,
@provstr = ‘DRIVER={SQL Server};SERVER=172.100.LO_QUE_SEA;UID=usuario;PWD=contrasena;’

SELECT campo_nvarchar 
FROM [produccion].midata.dbo.TABLA 
    where fid = @fid        
       AND (CONTAINS(v1, @v1) 
           OR CONTAINS(v2, @v2))

--Para borrarlo EXEC sp_dropserver ‘produccion’, ‘drologins’

Tiendo a pensar que tiene que ver más en cómo ve los datos que en cómo trate el and y el or.

Sigo pendiente a ver si te puedo ayudar.

Cerrar

Primer Query: Test 70 filas, Producción 58 filas Segundo Query: Test 70 filas, Producción 58 filas. Lo de enlazar sería estupendo, pero me temo que no tengo posibilidad. De todas formas, los datos de la tabla están importadas de uno a otro, luego debería tratarlos igual. He actualizado la pregunta, con lo de los valores de v MaLKaV_eS hace 1 año

Hace 1 año

Jesús Molinero
Votos
PositivosNegativosTotal
101

Podría ser el collate por defecto. Puedes comprobarlo lanzando esta query

SELECT CONVERT(varchar, SERVERPROPERTY('collation'))

en ambos servidores, si es diferente podrías obligar a uno determinado.

Cerrar

Es algo que no sabía, pero es el mismo Moderm_Spanish_CI_AS MaLKaV_eS hace 1 año

Hace 1 año

Gabriel Molina
Votos
PositivosNegativosTotal
101

No sé si es respuesta o comentario... Bueno, lo que veo es que ejecutas dinámicamente una select con clausulas contains. Lo del or, así puesto entre paréntesis me parece muy raro que afecte de algún modo. Se me ocurren varias cosas:

  • ¿Podría ser que afecte la longitud de los parámetros? Por ejemplo si la longitud definida en producción para los campos fuera mayor y justo la cadena que buscas cae fuera de esa longitud de parámetro, en el entorno de pruebas no las verías. A lo mejor es una comprobación chorra, pero a veces son cosas así las que fallan.

  • Comprueba que si no lo ejecutas en dinámico efectivamente pasa lo mismo. Para saber si el error está en cómo interpreta el texto el ejecutor dinámico. Pon el valor que esté fallando a capón, para ver si el problema está en la conversión de los parámetros dinámica.

  • Si has llegado hasta aquí... Queda, divide y vencerás, prueba la sentencia a cahitos, primero un contains (con el valor en que te ocurra), luego otro, luego otro... A ver cual es que el que da un resultado diferente.

  • También he buscado en la documentación por si el contains se interpreta diferente, pero no he visto nada por ahora... se supone que lo hacen igual :/

Cerrar

Pues parece que el problema va a estar en el contains AND (CONTAINS(c,@c) OR (CONTAINS(v1, @v1)) Voy a actualizar la pregunta... MaLKaV_eS hace 1 año

Tu respuesta

Confirmación

Cerrar

Si sales ahora, perderás los cambios. ¿Estás seguro de querer salir?

Para participar en Babelias, debes estar convenientemente validado. Si ya eres usuario inicia sesión, si no lo eres, te puedes registrar.

Dar una respuesta

Trata de ser descriptivo, usa al menos 25 caracteres