Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoyEste explorador ya no se admite.
Actualice a Microsoft Edge para aprovechar las características y actualizaciones de seguridad más recientes, y disponer de soporte técnico.
Se aplica a: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
En este artículo se describe cómo usar un archivo de formato para omitir la importación de una columna de tabla cuando los datos de la columna omitida no existen en el archivo de datos de origen. Un archivo de datos puede contener menos campos que el número de columnas de la tabla de destino; es decir, se puede omitir la importación de una columna, pero solo si se cumple al menos una de las dos condiciones siguientes en la tabla de destino:
Nota
Esta sintaxis, incluida la inserción masiva, no se admite en Azure Synapse Analytics. En Azure Synapse Analytics y otras integraciones de plataforma de base de datos en la nube, lleve a cabo el movimiento de datos con la instrucción COPY en Azure Data Factory o usando instrucciones T-SQL, como COPY INTO y PolyBase.
En los ejemplos de este artículo se espera una tabla denominada myTestSkipCol
en el esquema dbo
. Puedes crear esta tabla en una base de datos de ejemplo, como WideWorldImporters
o AdventureWorks
, o en cualquier otra base de datos. Para crear esta tabla, realice lo siguiente:
USE WideWorldImporters;
GO
CREATE TABLE myTestSkipCol
(
Col1 smallint,
Col2 nvarchar(50) NULL,
Col3 nvarchar(50) not NULL
);
GO
Los ejemplos de este artículo también usan un archivo de datos de ejemplo, myTestSkipCol2.dat
. Este archivo de datos solo contiene dos campos, aunque la tabla de destino tiene tres columnas.
1,DataForColumn3
1,DataForColumn3
1,DataForColumn3
Puede usar un archivo de formato no XML o uno XML para omitir una columna de tabla. En ambos casos, existen dos pasos:
El archivo de formato modificado debe asignar cada campo existente a su columna correspondiente en la tabla de destino. También debe indicar qué columna o columnas de la tabla se deben omitir.
Por ejemplo, para importar en bloque datos de myTestSkipCol2.dat
a la tabla myTestSkipCol
, el archivo de formato debe asignar el primer campo de datos a Col1
, omitir Col2
y asignar el segundo campo a Col3
.
Cree un archivo de formato no XML predeterminado para la tabla de ejemplo myTestSkipCol
mediante la ejecución del comando bcp siguiente en el símbolo del sistema:
bcp WideWorldImporters..myTestSkipCol format nul -f myTestSkipCol_Default.fmt -c -T
Importante
Es posible que deba especificar el nombre de la instancia de servidor a la que se va a conectar con el argumento -S
. También es posible que deba especificar el nombre de usuario y la contraseña con los argumentos -U
y -P
. Para obtener más información, consulte bcp Utility.
En el ejemplo anterior se crea un archivo de formato no XML, myTestSkipCol_Default.fmt
. Este formato de archivo se denomina archivo de formato predeterminado porque es el formulario generado por bcp. Un archivo de formato predeterminado describe una correspondencia de uno a uno entre los campos de archivo de datos y las columnas de la tabla.
En la siguiente captura de pantalla se muestran los valores de este archivo de formato predeterminado de ejemplo.
Nota
Para obtener más información sobre los campos de archivo de formato, consulta Archivos de formato no XML (SQL Server).
Existen dos alternativas para modificar un archivo de formato no XML predeterminado. Cada una de ellas indica que el campo de datos no existe en el archivo de datos y que no se debe insertar ningún dato en la columna correspondiente de la tabla.
Para omitir una columna de tabla, edite el archivo de formato no XML predeterminado y modifíquelo utilizando uno de los siguientes métodos alternativos:
El método de preferencia para omitir una columna consta de estos tres pasos:
El ejemplo siguiente se basa en el archivo de formato predeterminado para la tabla myTestSkipCol
. Este archivo de formato modificado asigna el primer campo de datos a Col1
, omite Col2
y asigna el segundo campo de datos a Col3
. La fila para Col2
se ha eliminado. El delimitador después del primer campo también se modificó de \t
a ,
.
14.0
2
1 SQLCHAR 0 7 "," 1 Col1 ""
2 SQLCHAR 0 100 "\r\n" 3 Col3 SQL_Latin1_General_CP1_CI_AS
Como alternativa, para omitir una columna de tabla, puede modificar la definición de la fila de archivo de formato que corresponda a la columna de tabla. En esta fila de formato de archivo los valores "prefix length", "host file data length" y "server column order" deben estar configurados en 0. Además, los campos "terminator" y "column collation" se deben estar establecidos en "" (es decir, en un valor vacío o NULL). El valor "nombre de columna de servidor" requiere una cadena que no esté en blanco, aunque el nombre de columna real no resulta necesario. Los campos de formato restantes requieren los valores predeterminados.
El siguiente ejemplo también se deriva del archivo de formato predeterminado para la tabla myTestSkipCol
.
14.0
3
1 SQLCHAR 0 7 "," 1 Col1 ""
2 SQLCHAR 0 0 "" 0 Col2 ""
3 SQLCHAR 0 100 "\r\n" 3 Col3 SQL_Latin1_General_CP1_CI_AS
Los siguientes ejemplos se basan en la tabla de ejemplo myTestSkipCol
y el archivo de datos de ejemplo myTestSkipCol2.dat
que se describieron anteriormente en este artículo.
Este ejemplo funciona usando cualquiera de los archivos de formato no XML modificados, tal y como se ha descrito en la sección anterior. En este ejemplo, el archivo de formato modificado se llama myTestSkipCol2.fmt
. Para usar BULK INSERT
a fin de importar en bloque el archivo de datos myTestSkipCol2.dat
, ejecuta el siguiente código enSQL Server Management Studio (SSMS). Actualice las rutas del sistema de archivos a la ubicación de los archivos de ejemplo del equipo.
USE WideWorldImporters;
GO
BULK INSERT myTestSkipCol
FROM 'C:\myTestSkipCol2.dat'
WITH (FORMATFILE = 'C:\myTestSkipCol2.fmt');
GO
SELECT * FROM myTestSkipCol;
GO
Cree un archivo de formato XML predeterminado para la tabla de ejemplo myTestSkipCol
mediante la ejecución del comando bcp siguiente en el símbolo del sistema:
bcp WideWorldImporters..myTestSkipCol format nul -f myTestSkipCol_Default.xml -c -x -T
Importante
Es posible que deba especificar el nombre de la instancia de servidor a la que se va a conectar con el argumento -S
. También es posible que deba especificar el nombre de usuario y la contraseña con los argumentos -U
y -P
. Para obtener más información, consulte bcp Utility.
En el ejemplo anterior se crea un archivo de formato XML, myTestSkipCol_Default.xml
. Este formato de archivo se denomina archivo de formato predeterminado porque es el formulario generado por bcp. Un archivo de formato predeterminado describe una correspondencia de uno a uno entre los campos de archivo de datos y las columnas de la tabla.
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="7"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Col1" xsi:type="SQLSMALLINT"/>
<COLUMN SOURCE="2" NAME="Col2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="Col3" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
Nota
Para obtener más información sobre la estructura de los archivos de formato XML, vea XML, archivos de formato (SQL Server).
Este es el archivo de formato XML modificado, myTestSkipCol2.xml
, que omite Col2
. Se han quitado las entradas FIELD
y ROW
para Col2
y se han vuelto a enumerar las entradas. El delimitador después del primer campo también se modificó de \t
a ,
.
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="7"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Col1" xsi:type="SQLSMALLINT"/>
<COLUMN SOURCE="2" NAME="Col3" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
Los siguientes ejemplos se basan en la tabla de ejemplo myTestSkipCol
y el archivo de datos de ejemplo myTestSkipCol2.dat
que se describieron anteriormente en este artículo.
Para importar datos de myTestSkipCol2.dat
a la tabla myTestSkipCol
, los ejemplos usan el archivo de formato XML modificado, myTestSkipCol2.xml
.
Con un archivo de formato XML, no se puede omitir una columna cuando se importa directamente a una tabla mediante un comando bcp o una instrucción BULK INSERT
. Sin embargo, se puede importar en todas las columnas de una tabla, excepto en la última columna. Si se tiene que omitir alguna columna, excepto la última, se debe crear una vista de la tabla de destino que contenga únicamente las columnas incluidas en el archivo de datos. De esta forma, se puede realizar una importación masiva de los datos de ese archivo en la vista.
En el siguiente ejemplo se crea la vista v_myTestSkipCol
en la tabla myTestSkipCol
. Esta vista omite la segunda columna de la tabla, Col2
. Después, en el ejemplo se usa BULK INSERT
para importar el archivo de datos myTestSkipCol2.dat
a la vista.
En SSMS, ejecute el código siguiente. Actualice las rutas del sistema de archivos a la ubicación de los archivos de ejemplo del equipo.
USE WideWorldImporters;
GO
CREATE VIEW v_myTestSkipCol AS
SELECT Col1,Col3
FROM myTestSkipCol;
GO
BULK INSERT v_myTestSkipCol
FROM 'C:\myTestSkipCol2.dat'
WITH (FORMATFILE='C:\myTestSkipCol2.xml');
GO
Para usar un archivo de formato XML para omitir una columna de tabla mediante el uso de OPENROWSET(BULK...)
, debe proporcionar una lista explícita de las columnas en la lista de selección y en la tabla de destino de la siguiente forma:
INSERT ...<column_list> SELECT <column_list> FROM OPENROWSET(BULK...)
En el siguiente ejemplo se utiliza el proveedor de conjuntos de filas BULK OPENROWSET
y el archivo de formato myTestSkipCol2.xml
. En el ejemplo se importa masivamente el archivo de datos myTestSkipCol2.dat
a la tabla myTestSkipCol
. La instrucción contiene una lista explícita de las columnas en la lista de selección y también en la tabla de destino, según convenga.
En SSMS, ejecute el código siguiente. Actualice las rutas del sistema de archivos a la ubicación de los archivos de ejemplo del equipo.
USE WideWorldImporters;
GO
INSERT INTO myTestSkipCol
(Col1,Col3)
SELECT Col1,Col3
FROM OPENROWSET(BULK 'C:\myTestSkipCol2.Dat',
FORMATFILE='C:\myTestSkipCol2.Xml'
) as t1 ;
GO
Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoyCursos
Módulo
Exploración de las opciones de manipulación de datos en Azure SQL Database - Training
Aprenda a invocar puntos de conexión de REST en Azure SQL Database y a manipular datos mediante Azure Functions. Además, explore varias herramientas y opciones para importar y exportar datos hacia y desde Azure SQL Database.
Documentación
Asignación de columnas de tabla a campos de archivo de datos con un archivo de formato - SQL Server
En SQL Server, los archivos de formato XML y no XML pueden alojar un archivo de datos cuyos campos están organizados en un orden diferente al de las columnas de la tabla.
Archivos de formato no XML (SQL Server) - SQL Server
SQL Server 2019 admite archivos de formato XML y no XML para la importación en bloque y la exportación masiva. Obtenga información sobre los archivos de formato no XML y sus ventajas.
Crear un archivo de formato con bcp (SQL Server) - SQL Server
Al importar en bloque o exportar de forma masiva una tabla de SQL Server, un archivo de formato permite escribir archivos de datos sin necesidad de leer o editar en gran medida archivos de datos de otros programas.