1

SQLLDR 和 CTL 文件

有一个 CSV 文件要导入。

我想在我的 CTL 文件中指定仅在我的 CSV 文件的某个列中有一个空值时才插入到我的表中。EG 我只想上传没有终止日期的用户记录。

我尝试了各种选择

  • 当 TERMINATIONDATE = ''
  • 当 TERMINATIONDATE = ""
  • 当 TERMINATIONDATE = null
  • 当 TERMINATIONDATE = 'null'

它仅在我使用时有效

  • 当 TERMINATIONDATE != '' 然后我得到所有已被终止的员工。但我想要相反的...

毕竟看起来不可能吗?

我的 CTL 文件

OPTIONS (SKIP=1)
LOAD DATA
INFILE 'C:\temp\users.csv' 
BADFILE 'C:\temp\users.bad'
DISCARDFILE 'C:\temp\users.dsc'
TRUNCATE
INTO TABLE "alawakaba"."users"
When TERMINATIONDATE = ''
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
ID,
FIRSTNAME,
LASTNAME,
FUNCTION,
DEPARTMENT,
COSTCENTER,
HIREDATE,
Field8 FILLER,
TERMINATIONDATE,
LOCCODE
)

(第 8 列只是我不需要的,所以我跳过它)

4

2 回答 2

1

It should work with the following clause:

WHEN TERMINATIONDATE = BLANKS
于 2011-05-23T18:16:11.353 回答
0

这不是最终的解决方案,并且有一些开销,但我可以在 2 次运行中完成:

a) 作为上面的 CTL 运行。
将When TERMINATIONDATE = ''更改

When TERMINATIONDATE != ''

丢弃的记录将被注入到DISCARDFILE 'C:\temp\users.dsc' 现在我丢弃的文件将包含我要上传的所有记录

b) 运行第二个 CTL 命令来拾取 DSC 文件作为输入,不要再跳过记录,也不要指定 when 子句

LOAD DATA
INFILE 'C:\temp\users.dsc' 
BADFILE 'C:\temp\users.bad'
DISCARDFILE 'C:\temp\users-run2.dsc'
TRUNCATE
INTO TABLE "alawakaba"."users"
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
ID,
FIRSTNAME,
LASTNAME,
FUNCTION,
DEPARTMENT,
COSTCENTER,
HIREDATE,
Field8 FILLER,
TERMINATIONDATE,
LOCCODE
)

不是最好的或最快的,但它可以解决问题。

不敢相信这样一个简单的子句在 SQLLDR 中从一开始就不起作用。

于 2011-05-26T07:22:21.580 回答