Sql-Server

使用嚮導導入 txt 時如何將空白導入為空值而不是零

  • April 19, 2019

我正在使用導入嚮導載入一個文本文件,並且需要整數欄位中的空白為空,但只插入零。

如何正確導入?

不幸的是,如果您堅持使用嚮導,這是不可能的,您需要使用 Visual Studio 編輯包。

在 Visual Studio 中編輯包時有一個選項“保持空值”

鑑於此 .csv 文件:

StringField,IntField
a,1
b,5
c,
d,6
e,
f,8
g,
h,
i,10
j,

和這個表定義

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

GO

當您使用嚮導導入數據時,空值將轉換為 0

但是,如果在嚮導結束時選擇“將包另存為”而不是在此螢幕中選擇“立即執行”

在此處輸入圖像描述

該文件可以保存在文件系統的某個位置。

如果您隨後創建一個新的集成服務項目,您可以像這樣添加一個現有的包

在此處輸入圖像描述

如果您瀏覽到剛剛保存的文件並查看它,您將看到一個數據流任務(如果您選擇創建表而不是附加到現有表,您還將看到一個執行 SQL 任務)

在此處輸入圖像描述

點兩下數據流進行編輯,點兩下數據源選中“保留空值”選項

在此處輸入圖像描述

然後點兩下目標查看屬性,然後將“保持空值”屬性更改為 true。

在此處輸入圖像描述

如果您然後點擊工具欄中的綠色箭頭或從菜單中選擇調試 > 開始調試以執行您的包,最終結果是這樣

在此處輸入圖像描述

說到底,巫師只是一個巫師。它為您生成一個 SSIS 包並選擇一些預設值,不幸的是不是您想要的預設值。

如果您想保留空值,除了使用 Visual Studio 編輯包之外沒有其他方法。

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

我看到您正在嘗試使用嚮導導入數據。您最好手動創建具有所需列定義的表,並使用 T-SQLBULK INSERT命令導入數據。

USE tempdb;

CREATE TABLE dbo.TestSource
(
  SomeNumber INT NULL
);

我創建了一個名為的純文字範例文件C:\temp\test.txt,其中包含以下行:

1

3
4

6
7

9

此語句將文本文件中的行導入TestSource表中:

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

這顯示了導入完成後的內容:

SELECT *
FROM dbo.TestSource;

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/123184