La precisión de los segundos fraccionarios excede la escala especificada en la vinculación de parámetros.
Cuando intento mover datos de una tabla de SQL Server 2019 a SQL Server 2012 utilizando un procedimiento almacenado con la ayuda de un servidor vinculado, obtengo el siguiente error:
El proveedor OLE DB “MSDASQL” para el servidor vinculado “SalesServer1” no pudo INSERTAR EN la tabla “[LinkedServer1].[SalesDepart].[dbo].[Employee_Salary]”.
El proveedor OLE DB “MSDASQL” para el servidor vinculado “SalesServer1” devolvió el mensaje “[Microsoft][ODBC Driver 17 para SQL Server] Desbordamiento de campo Datetime. La precisión de los segundos fraccionarios excede la escala especificada en la asignación de parámetros”.
La estructura de la tabla “Employee” es la misma en ambos servidores.
[Employee_Salary]
(
[SalaryID] [int] NOT NULL,
[Amount] [int] NOT NULL,
[Status] varchar NOT NULL,
[CreatedDate] [datetime] NOT NULL,
[EmployeeID][int] [NOT NULL]
)
Cuando ejecuto el procedimiento almacenado desde SQL Server 2019 en la base de datos “SalesDepart”, obtengo la excepción mostrada anteriormente.
Consulta en el procedimiento almacenado:
— Insertar registro en Employee_Salary
INSERT INTO SalesServer1.SalesDepart.dbo.Employee_Salary
([SalaryID], [Amount], [Description], [Status], [CreatedDate], [EmployeeID])
SELECT
SalaryID, Amount, Description, Status, CreatedDate, EmployeeID
FROM
Employee_Salary
Obtengo un error para la columna “CreatedDate”, el tipo de dato es “datetime”.
davy.ai
El mensaje de error indica que hay un problema con la precisión de los segundos fraccionarios de la columna
CreatedDate
en la tablaEmployee_Salary
. Parece que el tipo de datodatetime
tiene una escala predeterminada diferente en SQL Server 2019 que en SQL Server 2012, lo que está causando el error de desbordamiento al insertar datos del servidor 2019 al servidor 2012.Una forma de resolver este problema sería convertir explícitamente la columna
CreatedDate
a un tipo de datodatetime2
con una precisión específica que coincida con el SQL Server 2012 de destino. La precisión del tipo de datodatetime2
representa el número de lugares decimales del componente de segundos fraccionarios.Aquí hay un ejemplo de consulta que convierte la columna
CreatedDate
adatetime2
con una precisión de 3:Esto debería resolver el error de desbordamiento truncando el componente de segundos fraccionarios de la columna
CreatedDate
para que coincida con la precisión del tipo de dato del SQL Server 2012 de destino.