Я использую bcp для загрузки таблицы из CSV, экспортированной из другой таблицы кем-то еще очень далеко, и столкнулся с некоторыми проблемами. Мои первые две проблемы: одно экспортируемое поле - это int, которое должно заканчиваться в поле varchar, а другое поле должно быть заполнено статической строкой. Ну, во-первых, ничего страшного, и ответ Чада привел меня к синтаксису @{n='Col3';e={'ABC'}}
. Но я спотыкаюсь о нескольких проблемах при загрузке данных правильно.
Иногда значение может не иметь пробелов, иногда это может быть. Как мне указать разделители для этого в файле формата BCP? Я спрашиваю, потому что, вероятно, мне нужно заключить их в кавычки.
а. Должен ли я заключать значения в промежуточный CSV-файл в кавычки?
В моем тестовом коде он помещает заголовки столбцов и перевод строки в Col1 с фактическим значением Col1 для первой строки.
В моем фактическом неанизированном коде я получаю String data, right truncation
в первой строке, хотя вторая строка вставлена нормально.
Во всяком случае, исходные данные CSV, которые я получаю из других источников, выглядят так (примечание: строки заголовка нет)
"ABC123",123456,"APPLE"
"XYZ789",456789,"ORANGE"
Целевая таблица SQL выглядит следующим образом
Col1 varchar(50) (Primary Key)
Col2 varchar(50)
Col3 varchar(50)
Col4 varchar(50)
Мне нужно загрузить ABC123 в Col1
, 123456 в Col2
, Export1 в Col3
и APPLE в Col4
. Export1 - статическая строка. Я делаю это в Powershell 1.0.
РЕДАКТИРОВАТЬ: Chad's import-csv | export-csv выглядит многообещающе, но ему не нравятся отсутствующие заголовки, а PS 1.0 не поддерживает опцию -Header.
РЕДАКТИРОВАТЬ: Отредактированное описание выше, чтобы отразить, как я добрался до этого момента. Таблица с четырьмя столбцами и CSV с тремя столбцами, очевидно, являются упрощениями. Один настоящий столбец - это город, поэтому он может содержать простые строки или те, которые требуют цитирования. Мой код Powershell 1.0 на данный момент выглядит следующим образом.
$SQLSERVER="svr"
$SQLTABLE="test"
$SQLUSER="u"
$SQLPASS="p"
$TESTFILE = "testdata.csv"
$TESTFILEHDR = "testdata-wHeaders.csv"
$TESTFILEFIX = "testdata-fixed.csv"
$OrigHeaders = "`"Col1`",`"Col2`",`"Col3`"`n"
function Create-BcpFormat($fileName)
{
@"
<?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=',"' COLLATION='SQL_AltDiction_CP850_CI_AS'/>
<FIELD ID='2' xsi:type='CharTerm' TERMINATOR='",' COLLATION='SQL_AltDiction_CP850_CI_AS'/>
<FIELD ID='3' xsi:type='CharTerm' TERMINATOR=',' COLLATION='SQL_AltDiction_CP850_CI_AS'/>
<FIELD ID='4' xsi:type='CharTerm' TERMINATOR='\r\n' COLLATION='SQL_AltDiction_CP850_CI_AS'/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Col1" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="2" NAME="Col2" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="3" NAME="Col3" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="4" NAME="Col4" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
"@ | Set-Content $filename
}
## GHI456 is already in the table, clean out previous attempts
"`nclean test table:"
osql @("-S","$SQLSERVER","-U","$SQLUSER","-P","$SQLPASS","-Q",
"""delete from $SQLTABLE where col1 <> 'GHI456' or col1 is null""")
## Prepend
$body = [string]::join([environment]::NewLine, (gc $TESTFILE))
$OrigHeaders + $body > $TESTFILEHDR
"`nTESTFILEHDR:"
type $TESTFILEHDR
$accts = Import-csv $TESTFILEHDR | select 'Col1', 'Col2', @{n='Col3';e={'ABC'}}, @{n='Col4';e={$_.Col3}}
$accts
$accts | Export-Csv $TESTFILEFIX -NoTypeInfo
"`nTESTFILEFIX:"
type $TESTFILEFIX
$BCPFMTFILE = "bcp.fmt"
$BCPERRFILE = "bcp.err"
Create-BcpFormat $BCPFMTFILE
bcp @("$SQLTABLE","in","$TESTFILEFIX","-S","$SQLSERVER","-U","$SQLUSER","-P","$SQLPASS","-f",$BCPFMTFILE,"-e",$BCPERRFILE)
Remove-Item $BCPFMTFILE
"`ntest table:"
osql @("-S","$SQLSERVER","-U","$SQLUSER","-P","$SQLPASS","-Q",
"""select left(Col1,20) 'Col1', left(Col2,8) 'Col2', left(Col3,8) 'Col3', left(Col4,8) 'Col4' from $SQLTABLE""")
"`nBCPERRFILE:"
type $BCPERRFILE