Sql server 大容量插入正在将空值替换为NULL

Sql server 大容量插入正在将空值替换为NULL,sql-server,powershell,bulkinsert,sql-scripts,windows-scripting,Sql Server,Powershell,Bulkinsert,Sql Scripts,Windows Scripting,我有一个巨大的CSV文件,其中有许多空白值,如: 值1、值2、值3、值4、值5、值6、值8、值9、值10、值 我正试图通过PS脚本导入。为此,我使用以下powershell脚本 $Server = 'server_value' $Database = 'db_value' $Username = 'usr_value' $Password = 'pass_value' $table = 'table_value' $CSVFilePath = "csv_file_path.csv" $DbQue

我有一个巨大的CSV文件,其中有许多空白值,如:

值1、值2、值3、值4、值5、值6、值8、值9、值10、值

我正试图通过PS脚本导入。为此,我使用以下powershell脚本

$Server = 'server_value'
$Database = 'db_value'
$Username = 'usr_value'
$Password = 'pass_value'
$table = 'table_value'
$CSVFilePath = "csv_file_path.csv"
$DbQuery = "BULK INSERT $table FROM '$CSVFilePath' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR='\n')"

# Create SQL connection
$DbConnection = New-Object System.Data.SqlClient.SqlConnection
$DbConnectionString = "Server = $Server; Database = $Database; User ID=$Username; Password=$password; pooling=false;"
$DbConnection.ConnectionString = $DbConnectionString
$DbConnection.Open()

# Create SQL command
$DbCommand = New-Object System.Data.SQLClient.SQLCommand  
$DbCommand.Connection = $DbConnection 
$DbCommand.CommandText = $DbQuery 

# Execute
$DbCommand.ExecuteNonQuery()

# Close connection
$DbConnection.Close()
我得到的结果是:

COLUMN01 | COLUMN02 | COLUMN03 | COLUMN04 | COLUMN05 | COLUMN06 | COLUMN07 | COLUMN08 | COLUMN09 | COLUMN10 | COLUMN11 | COLUMN12 | COLUMN13 | COLUMN14
VALUE001 | VALUE002 | VALUE003 | VALUE004 | VALUE005 | VALUE006 |   NULL   | VALUE008 | VALUE009 | VALUE010 | VALUE011 |   NULL   |   NULL   |   NULL   
我真正想要的是:

COLUMN01 | COLUMN02 | COLUMN03 | COLUMN04 | COLUMN05 | COLUMN06 | COLUMN07 | COLUMN08 | COLUMN09 | COLUMN10 | COLUMN11 | COLUMN12 | COLUMN13 | COLUMN14
VALUE001 | VALUE002 | VALUE003 | VALUE004 | VALUE005 | VALUE006 |          | VALUE008 | VALUE009 | VALUE010 | VALUE011 |          |          |          
我已经在空值上尝试了单引号和双引号,如下所示:

BULK INSERT $table
FROM '$CSVFilePath'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR='\n',
    KEEPNULLS
)
值1、值2、值3、值4、值5、值6、值8、值9、值10、“”、“”、“”

或:

值1、值2、值3、值4、值5、值6、值8、值9、值10、值

我得到的是:

COLUMN01 | COLUMN02 | COLUMN03 | COLUMN04 | COLUMN05 | COLUMN06 | COLUMN07 | COLUMN08 | COLUMN09 | COLUMN10 | COLUMN11 | COLUMN12 | COLUMN13 | COLUMN14
VALUE001 | VALUE002 | VALUE003 | VALUE004 | VALUE005 | VALUE006 |    ''    | VALUE008 | VALUE009 | VALUE010 | VALUE011 |    ''    |    ''    |    ''    
或:

还尝试了批量插入上的KEEPNULLS,如下所示:

BULK INSERT $table
FROM '$CSVFilePath'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR='\n',
    KEEPNULLS
)

但不起作用。

执行大容量插入时,空值处理方式的选项是两件事之一

  • 使用空值
  • ,或

  • 使用为列定义的默认值
  • 选项2的问题是。。。如果未指定任何文字,则NULL是列的默认值。也就是说,如果表中没有定义默认值,则选项为NULL、NULL或KEEPNULL(也为NULL)

    所以…,您唯一的实际选择是更改表,并在需要此行为的所有列上定义一个空字符串作为默认值

    请参见此处的示例: