Hola, chicos,
¡Buenas noches!
En el post de hoy hablaré de un error no muy común que ocurre en SQL Server al intentar ejecutar consultas usando Linked Server o instrucciones entre servidores (Ej: OPENROWSET, OPENQUERY, etc.) y SQL Server devuelve el siguiente mensaje:
Mensaje 7405, Nivel 16, Estado 1, Línea 45
Las consultas heterogéneas requieren que se establezcan las opciones ANSI_NULLS y ANSI_WARNINGS para la conexión. Esto garantiza una semántica de consulta coherente. Habilite estas opciones y luego vuelva a emitir su consulta.
La primera vez que vi este error fue cuando mi colega henry mauri, el chico que me está dando más ideas para publicaciones últimamente, lo intentó crear una secuencia y usarla en una función escalar que fue llamado desde un procedimiento almacenado dentro de una aplicación escrita en C# y encontró este mensaje de error.
Este problema ocurre especialmente cuando deshabilita manualmente las declaraciones ANSI_NULLS y ANSI_WARNINGS antes de usar un servidor vinculado en SQL Server. Entendamos por qué sucede esto y cómo solucionarlo.
¿Por qué utilizar ANSI_NULLS y ANSI_WARNINGS?
En primer lugar, debo dejar claro que el problema informado en esta publicación solo ocurre cuando al menos una de estas dos configuraciones está desactivada (OFF). Ya hablé de ambos en mi post. Comandos SET de SQL Server. El valor predeterminado de SQL Server es que estén activados (ON), pero muchas personas terminan deshabilitándolos para evitar alertas al usar algunas consultas en la base de datos MAL.
Ejemplos de uso:

Le recomiendo encarecidamente que NO deshabilite ANSI_NULLS y ANSI_WARNINGS en sus rutinas. De hecho, ni siquiera recuerdo la última vez que necesité cambiar el comportamiento predeterminado de una consulta usando comandos SET (excepto usando SET LANGUAGE y SET DATEFORMAT).
Según el propio sitio web de Microsoft, en una versión futura de SQL Server, ANSI_NULLS siempre estará ENCENDIDO y cualquier aplicación que establezca explícitamente la opción en APAGADO generará un error. Evite utilizar esta función en nuevos trabajos de desarrollo y planee modificar las aplicaciones que la utilizan actualmente.
Simulando el problema
Para simular este problema, proporcionaré un script a continuación que mostrará exactamente este mensaje de error. Recuerde cambiar el nombre de LinkedServer por el nombre de su instancia de SQL Server.
----------------------------------
-- CRIAÇÃO DO LINKED SERVER
----------------------------------
USE [master]
GO
DECLARE @instancia NVARCHAR(200) = N'127.0.0.1\SQL2014'
IF ((SELECT COUNT(*) FROM sys.servers WHERE name = @instancia) > 0)
EXEC master.dbo.sp_dropserver @server=@instancia, @droplogins='droplogins'
EXEC master.dbo.sp_addlinkedserver @server = @instancia, @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=@instancia,@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
----------------------------------
-- CRIAÇÃO DA TABELA DE TESTES
----------------------------------
IF (OBJECT_ID('Testes.dbo.Teste') IS NOT NULL) DROP TABLE Testes.dbo.Teste
SELECT 12456.74 AS Valor, 'Teste 1' AS Tipo
INTO Testes.dbo.Teste
UNION
SELECT 1314.00, 'Teste 2'
UNION
SELECT 745.99, 'Teste 2'
UNION
SELECT 1587.90, 'Teste 1'
UNION
SELECT 100, NULL
UNION
SELECT NULL, NULL
----------------------------------
-- SIMULAÇÃO DO ERRO
----------------------------------
SET ANSI_NULLS OFF
GO
SELECT SUM(Valor), Tipo
FROM [127.0.0.1\SQL2014].Testes.dbo.Teste
GROUP BY Tipo

resolviendo el problema
Chicos, la solución a este problema es extremadamente simple y ya queda claro en el mensaje de error y en todo lo que ya dije en la publicación. Simplemente active los parámetros SET ANSI_WARNINGS AND SET ANSI_NULLS.

Si ya hizo esto y sigue recibiendo este mensaje de error, revise todo el código fuente, porque ese es definitivamente el problema. Vea si no hay ningún SP ejecutándose y está deshabilitando una de las dos opciones o algún código ad-hoc en su aplicación o en su capa de acceso a la base de datos. Verifique también el comando de creación de los procedimientos almacenados involucrados, ya que estas opciones pueden haberse deshabilitado en el comando CREATE/ALTER PROCEDURE.
Espero que te haya gustado el post.
¡Hasta la próxima!
Comentários (0)
Carregando comentários…