sql - puede - no se pudo convertir el valor debido a una posible pérdida de datos
El paquete SSIS no desea recuperar los metadatos de la tabla temporal (5)
Tengo un paquete SSIS, que contiene múltiples flujos.
Cada flujo es responsable de crear una tabla de "preparación", que se llena después de la creación. Estas tablas son tablas temporales globales .
Agregué 1 flujo adicional (no hice el paquete) que hace exactamente lo que se indicó anteriormente, para otra tabla. Sin embargo, por alguna razón, el paquete falla intermitentemente en este flujo, mientras que es exactamente igual a otros, además de algunos nombres de tablas.
El error que sigue apareciendo:
Actualización: insertar flujo de datos: Error: Código de error SSIS DTS_E_OLEDBERROR. Se ha producido un error OLE DB. Código de error: 0x80004005. Un registro OLE DB está disponible. Fuente: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Descripción: "Error no especificado". Un registro OLE DB está disponible. Fuente: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Descripción: "Los metadatos no se pudieron determinar porque la declaración ''select * from'' ## TmpMcsConfigurationDeviceHistory86B34BFD041A430E84CCACE78DA336A1 ''usa una tabla temporal.".
Expresión de creación:
"CREATE TABLE " + @[User::TmpMcsConfigurationDeviceHistory] + " ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL)
"
Expresión analizada (= evaluada):
CREATE TABLE ##TmpMcsConfigurationDeviceHistory764E56F088DC475C9CC747CC82B9E388 ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL)
Descubrí que el problema residía en un problema de duplicado de GUID, copié elementos (como el de crear tablas temporales) y todos recibieron la misma guía al copiar. Utilicé una herramienta para restablecer todas estas guías en mi paquete y esto resolvió mi problema.
¡Gracias!
Otra opción (tipo de pirateo, pero funciona y no requiere que cambies tu uso de tablas temporales globales) es usar el comando SET FMTONLY ON delante de tu consulta real para enviar un "Primer conjunto de resultados" falso a SSIS con su estructura de columna correcta. Así que puedes hacer algo como
SET FMTONLY ON
select 0 as a, 1 as b, ''test'' as C, GETDATE() as D
SET FMTONLY OFF
select a, b, c, d from ##TempTable
Cuando SSIS ejecuta sp_describe_first_result_set, devolverá los metadatos y los nombres de columna de su comando FMTONLY, y no se quejará de no poder determinar los metadatos de su tabla temporal porque ni siquiera lo intentará.
Si está trabajando en SSIS 2012, entonces utiliza el procedimiento almacenado del sistema sp_describe_first_result_set para obtener los metadatos de las tablas y no admite tablas temporales. Pero puede optar por otras opciones como variables de tabla y CTE que funcionarán bien. https://connect.microsoft.com/SQLServer/feedback/details/629077/denali-engine-metadata-discovery-shuns-temp-tables
Tenía el mismo problema que usamos la tabla temporal para la puesta en escena. Después de pasar algún tiempo, encontró un trabajo alrededor.
En la tarea OLE DB / ADO Destino del flujo de datos donde se especifica el nombre de la tabla de etapas.
Cambie la propiedad AccessMode a comando SQL en lugar de OpenRowSet y especifique la propiedad Comando SQL para "seleccionar * de #temp".
Hurra, está funcionando como se esperaba.
La captura aquí es cuando se especifica un modo de acceso diferente al comando SQL, SSIS espera que sea una tabla / vista y cambió el SSIS para llamar a sp_describe_first_result_set para obtener los metadatos pero cuando especifica el Comando SQL, está esperando una consulta o un comando SP, por lo que, afortunadamente, todavía usa la forma antigua de obtener los metadatos.
El uso de WITH RESULT SETS
para definir explícitamente los metadatos permitirá a SSIS omitir el paso sp_describe_first_result_set
y usar los metadatos que defina. La ventaja es que puede usar esto para hacer que SSIS ejecute SQL que contiene una tabla temporal (para mí, ese rendimiento me ayudó mucho); el inconveniente es que tienes que mantenerlo manualmente y actualizarlo si algo cambia.
Muestra de consulta (procedimiento almacenado :)
EXEC (''dbo.MyStoredProcedure'')
WITH RESULT SETS
(
(
MyIntegerColumn INT NOT NULL,
MyTextColumn VARCHAR(50) NULL,
MyOtherColumn BIT NULL
)
)
Ejemplo de consulta (SQL simple :)
EXEC (''
CREATE TABLE #a
(
Col INT
)
INSERT INTO #a
(
COL
)
SELECT 1 AS Col
SELECT Col
FROM #a'')
WITH RESULT SETS ( (Col INT NOT NULL))
)