Pregunta

Quiero importar un archivo de texto de una columna a una de mis tablas de SQL. El archivo es solo una lista de malas palabras.

He escrito el siguiente TSQL para hacer esto

BULK INSERT SwearWords
FROM 'c:\swears.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)

Sin embargo, se produce un error con el final del archivo no detectado. La tabla a la que se va a importar es solo un campo de identidad seguido de un campo nvarchar en el que quiero insertar el texto. Funciona bien si agrego en el archivo de texto " 1, " al comienzo de la línea eveyr, asumo que esto se debe a que SQL está buscando 2 campos. ¿Hay alguna forma de evitar esto?

Gracias

¿Fue útil?

Solución

Necesita usar FORMATFILE para esto. Consulte INSERCIÓN A GRANEL .

  

FORMATFILE [= 'format_file_path']

     

Especifica la ruta completa de un formato   expediente. Un archivo de formato describe los datos.   archivo que contiene respuestas almacenadas   creado usando la utilidad bcp en el   misma mesa o vista. El archivo de formato   debe utilizarse en los casos en que:

* The data file contains greater or fewer columns than the table or view.

* The columns are in a different order.

* The column delimiters vary.

* There are other changes in the data format. Format files are usually created by using the bcp utility and modified with a text editor as needed. For more information, see bcp Utility.

Para obtener información más detallada, consulte Uso de archivos de formato .

Otros consejos

Esto se describe en los libros en línea para BULK INSERT bajo el argumento KEEPIDENTITY. Aquí está lo que se dice

  

KEEPIDENTITY   Especifica que los valores para una columna de identidad están presentes en el archivo importado. Si no se proporciona KEEPIDENTITY, se ignoran los valores de identidad para esta columna en el archivo de datos importados, y SQL Server asigna automáticamente valores únicos basados ??en los valores de inicialización e incremento especificados durante la creación de la tabla. Si el archivo de datos no contiene valores para la columna de identidad en la tabla o vista, use un archivo de formato para especificar que la columna de identidad en la tabla o vista se debe omitir al importar datos; SQL Server asigna automáticamente valores únicos para la columna

Por lo tanto, use un archivo de formato o suministre un valor ficticio y asegúrese de no usar el argumento KEEPIDENTITY

Además, puede crear una vista en su tabla solo en la columna nvarchar y luego BULK INSERT en su vista. Esta es una forma muy limpia de usar BULK INSERT.

De esta manera, no necesita preocuparse por su columna IDENTIDAD, o crear un archivo de formato.

Su declaración BULK INSERT debería verse así:

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')

Debe asegurarse de que la estructura de su archivo de texto y la tabla coincidan; si la tabla tiene dos campos, también deberá proporcionar dos campos / columnas en el archivo de texto.

Dado que la primera columna en la tabla SQL es un campo IDENTIDAD, puede proporcionar cualquier valor que desee, pero debe tener un valor allí, no creo que haya ninguna manera de evitar esto.

Marc

Verifique que la última línea tenga CR / LF (\ r \ n). A veces ese es el problema, otras veces, un retorno de carro adicional se encuentra al final del archivo. Puedes comprobarlo con un hexeditor.

Puede eliminar la columna de identidad y volver a colocarla cuando haya terminado. De forma alternativa, si eso rompe las relaciones con la base de datos, puede realizar la importación utilizando DTS o SSIS si es una importación que se realiza una sola vez.

En SQL Server 2008 me ha resultado más fácil simplemente crear un archivo que contenga una gran cantidad de inserciones y pegarlo en la ventana de consulta de Management Studio, en lugar de luchar por obtener el archivo de formato y los permisos de archivo de inserción masiva de forma correcta :

USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)

http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row -constructor /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top