如何在使用向导导入 txt 时将空白导入为空值而不是零

Vla*_*mir 8 sql-server import sql-server-2012 integer

我正在使用导入向导加载文本文件,并且需要整数字段中的空白为空,但只插入零。

如何正确导入?

Tom*_*m V 8

不幸的是,如果您坚持使用向导,这是不可能的,您需要使用 Visual Studio 编辑包。

在 Visual Studio 中编辑包时有一个选项“保持为空”

鉴于此 .csv 文件:

StringField,IntField
a,1
b,5
c,
d,6
e,
f,8
g,
h,
i,10
j,
Run Code Online (Sandbox Code Playgroud)

和这个表定义

CREATE TABLE [dbo].[NullTest](
    [StringField] [varchar](50) NULL,
    [IntField] [int] NULL
) ON [PRIMARY]

GO
Run Code Online (Sandbox Code Playgroud)

使用向导导入数据时,空值将转换为 0

但是,如果在向导结束时您选择“将包另存为”而不是像此屏幕中的“立即运行”

在此处输入图片说明

该文件可以保存在文件系统的某处。

如果您随后创建了一个新的 Integration Services 项目,您可以像这样添加一个现有的包

在此处输入图片说明

如果您浏览到刚刚保存的文件并查看它,您将看到一个数据流任务(如果您选择创建表而不是附加到现有表,您也会看到一个执行 SQL 任务)

在此处输入图片说明

双击数据流进行编辑,双击数据源勾选“保留空值”选项

在此处输入图片说明

然后双击目标以查看属性,然后将“保留空值”属性更改为 true。

在此处输入图片说明

如果您然后单击工具栏中的绿色箭头或从菜单中选择调试 > 开始调试以执行您的包,最终结果是这样的

在此处输入图片说明

说到底,巫师只是一个巫师。它为您生成一个 SSIS 包并选择一些默认值,不幸的是不是您想要的默认值。
如果您想保留空值,除了使用 Visual Studio 编辑包外,别无他法。

再说一次,在 Visual Studio 中自己创建包或使用@MaxVernon 的 T-SQL 解决方案可能更容易。


Han*_*non 6

我看到您正在尝试使用向导导入数据。您最好使用所需的列定义手动创建表,并使用 T-SQLBULK INSERT命令导入数据。

 USE tempdb;

 CREATE TABLE dbo.TestSource
 (
   SomeNumber INT NULL
 );
Run Code Online (Sandbox Code Playgroud)

我创建了一个名为的纯文本示例文件C:\temp\test.txt,其中包含以下行:

 1

 3
 4

 6
 7

 9
Run Code Online (Sandbox Code Playgroud)

此语句将文本文件中的行导入TestSource表中:

 BULK INSERT dbo.TestSource
    FROM 'C:\temp\test.txt'
    WITH (
       DATAFILETYPE = 'char',
       FIELDTERMINATOR = ',',
       KEEPNULLS
    );
Run Code Online (Sandbox Code Playgroud)

导入完成后的内容如下:

 SELECT *
 FROM dbo.TestSource;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Mar*_*ith 6

如果您至少有 SSMS v 17.3 并且要导入到新创建的表,您可以使用导入平面文件到 SQL 向导

在 Tom 的回答中针对 CSV 文件运行它。

在此处输入图片说明

结果表看起来像

在此处输入图片说明