"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo lanzar correctamente las variables para insertos a granel en T-SQL?

¿Cómo lanzar correctamente las variables para insertos a granel en T-SQL?

Publicado el 2025-03-25
Navegar:217

How to Correctly Cast Variables for Bulk Inserts in T-SQL?

Variables de fundición para insertar a granel en tsql

en t-sql, la instrucción de inserción a granel permite importar los datos de un archivo externo en una tabla. Sin embargo, si se usa una variable de cadena como fuente de datos, puede ocurrir un error.

Problema:

El siguiente código T-SQL falla con un error (parte de un procedimiento almacenado):

declare @csvfile nvarchar (255); Set @csvfile = n't: \ x.csv '; Inserto masivo [DBO]. [TStagingTable] - De n't: \ x.csv '- esta línea funciona De @csvfile: esta línea falla CON ( Field terminator = ',', RowTerminator = '\ n', Firstrow = 2 )
DECLARE @CSVfile nvarchar(255);
SET @CSVfile = N'T:\x.csv';
BULK INSERT [dbo].[TStagingTable]
-- FROM N'T:\x.csv' -- This line works
FROM @CSVfile -- This line fails
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW = 2
)
Mensaje de error:

Incorrecta sintaxis cerca de la palabra clave 'con'.
DECLARE @CSVfile nvarchar(255);
SET @CSVfile = N'T:\x.csv';
BULK INSERT [dbo].[TStagingTable]
-- FROM N'T:\x.csv' -- This line works
FROM @CSVfile -- This line fails
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW = 2
)

motivo:

en la declaración de inserción masiva, la cláusula de la cláusula requiere una cadena literal como la ruta del archivo de entrada. Cuando se usa una variable, debe emitirse a una cadena literal.

SOLUCIÓN:

para lanzar la variable @csvfile a una cadena literal, use la siguiente sintax dinámica T-SQL:

Declar @q nvarchar (max); set @q = 'Inserto masivo [TStagingTable] De 'char (39) @csvfile char (39)' CON ( Field terminator = '', '', RowTerminator = '' \ n '', Firstrow = 1 ) ' exec (@q)
DECLARE @CSVfile nvarchar(255);
SET @CSVfile = N'T:\x.csv';
BULK INSERT [dbo].[TStagingTable]
-- FROM N'T:\x.csv' -- This line works
FROM @CSVfile -- This line fails
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW = 2
)
Este código genera una instrucción SQL dinámica que lanza @csvfile a una cadena literal dentro de la cláusula FOME, resolviendo el problema y permitiendo que el inserto masivo tenga éxito.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3