Search code examples
sqlsql-serverxmlbcp

BCP insert skip one DB column


I am using a BCP with a file format XML to import from a csv into a SQL database.

It works until I add a new column called DATERIF, that I should skip, but I cannot. With the following templates, instead of skipping the column, the import is also filling that one, leaving the last one (MODELLO) empty, I tried to add after the 6th column a row like this one, but in that case an error is raised at runtime.

<COLUMN SOURCE="0" NAME="DATERIF" xsi:type="SQLDATETIME" />

here the complete template file

<?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="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="2" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="3" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="4" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="5" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="6" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="7" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="8" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="9" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="10" xsi:type="CharTerm" TERMINATOR=";" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
        <FIELD ID="11" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="20"
               COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1" NAME="HOSTNAME" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="2" NAME="IP_MACCH" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="3" NAME="LOGIN" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="4" NAME="T_TYPE" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="5" NAME="DATA_RIL" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="6" NAME="ORA_RIL" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="0" NAME="DATERIF" xsi:type="SQLDATETIME"/>
        <COLUMN SOURCE="7" NAME="CUSTOMER" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="8" NAME="NUMORDINE" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="9" NAME="OPERATORE" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="10" NAME="SERIALNUM" xsi:type="SQLVARYCHAR" LENGTH="20"/>
        <COLUMN SOURCE="11" NAME="MODELLO" xsi:type="SQLVARYCHAR" LENGTH="20"/>
    </ROW>
</BCPFORMAT>

How can I skip this field an import in the following ones? Thank you Andrea


Solution

  • I am assuming that you are using MS SQL Server. The scenario where a DB table has one or few additional column(s) is resolved by using a view. That view definition needs to exclude not needed columns. After that you can BULK INSERT into a view instead of the DB table.

    It is documented in BOL: Using BULK INSERT with a view