sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué obtengo estos resultados diferentes de dos consultas SQL?

Desafortunadamente, este es un método poco confiable de concatenación de cadenas en SQL Server. Lo evitaría en todos los casos excepto en los más triviales. Hay más información en este KB:El plan de ejecución y los resultados de las consultas de concatenación agregada dependen de Ubicación de expresión .

Dicho esto, pude duplicar su problema y proporcionar una solución en mi entorno:

SET @val = ''
SELECT @val = @val + 'Hello, my name is ' + replace([name], '', '') + '!' + CHAR(10) + CHAR(13)
FROM LINKED.A.sys.tables

Observe que he agregado una función de reemplazo vacía a la expresión. Aunque no debería hacer nada a la salida, agrega un local paso "calcular escalar" al plan de consulta. Esto parece retirar todos los datos de la columna de nombre para luego procesarlos localmente en lugar de permitir que la consulta remota devuelva lo que cree que se necesita.

No estoy seguro de si hay una mejor función para usar que no sea un replace con argumentos vacíos. Tal vez un doble reverse o algo. Solo asegúrese de convertir a un tipo de datos máximo si es necesario, como lo indica la documentación.

ACTUALIZAR

Simplemente declarando @var como varchar(max) en lugar de nvarchar(max) aclara el problema, ya que luego recupera la columna de nombre completa (escriba sysname, o nvarchar (128), creo) para el procesamiento local al igual que lo hizo la función de reemplazo. No puedo pretender saber qué combinación de configuración del servidor vinculado y la conversión implícita hace que esto suceda. ¡Esperemos que alguien con más conocimientos en esta área pueda intervenir!