2017-07-06 85 views
1

我正在使用的數據集可以在here找到。如何修改此SQL SELECT語句以更改非數字值?

我正在使用SSIS將數據集上傳到MS SQL Server。

我上傳了一切文本,並試圖通過插入原始表中的值創建一個適當的數據類型的工作表。

CREATE TABLE [WRK_demographics] 
(
     [RowNumber]   INT IDENTITY(1,1) 
     ,[DBN]    VARCHAR(10) 
     ,[Name]    VARCHAR(1000) 
     ,[schoolyear]  VARCHAR(100) 
     ,[fl_percent]  FLOAT 
     ,[frl_percent]  FLOAT 
     ,[total_enrollment] INT 
     ,[grade9]   INT 
     ,[grade10]   INT 
     ,[grade11]   INT 
     ,[grade12]   INT 
     ,[ell_num]   INT 
     ,[ell_percent]  FLOAT 
     ,[sped_num]   INT 
     ,[sped_percent]  FLOAT 
     ,[ctt_num]   INT 
     ,[selfcontained_num] INT 
     ,[asian_num]  INT 
     ,[asian_per]  FLOAT 
     ,[black_num]  INT 
     ,[black_per]  FLOAT 
     ,[hispanic_num]  INT 
     ,[hispanic_per]  FLOAT 
     ,[white_num]  INT 
     ,[white_per]  FLOAT 
     ,[male_num]   INT 
     ,[male_per]   FLOAT 
     ,[female_num]  INT 
     ,[female_per]  FLOAT 
) 

INSERT INTO [WRK_demographics] 
(  
     [DBN] 
     ,[Name] 
     ,[schoolyear] 
     ,[fl_percent] 
     ,[frl_percent] 
     ,[total_enrollment] 
     ,[grade9] 
     ,[grade10] 
     ,[grade11] 
     ,[grade12] 
     ,[ell_num] 
     ,[ell_percent] 
     ,[sped_num] 
     ,[sped_percent] 
     ,[ctt_num] 
     ,[selfcontained_num] 
     ,[asian_num] 
     ,[asian_per] 
     ,[black_num] 
     ,[black_per] 
     ,[hispanic_num] 
     ,[hispanic_per] 
     ,[white_num] 
     ,[white_per] 
     ,[male_num] 
     ,[male_per] 
     ,[female_num] 
     ,[female_per]    
) 
SELECT 
     [DBN] 
     ,[Name] 
     ,[schoolyear] 
     ,[fl_percent] 
     ,[frl_percent] 
     ,[total_enrollment] 
     ,[grade9] 
     ,[grade10] 
     ,[grade11] 
     ,[grade12] 
     ,[ell_num] 
     ,[ell_percent] 
     ,[sped_num] 
     ,[sped_percent] 
     ,[ctt_num] 
     ,[selfcontained_num] 
     ,[asian_num] 
     ,[asian_per] 
     ,[black_num] 
     ,[black_per] 
     ,[hispanic_num] 
     ,[hispanic_per] 
     ,[white_num] 
     ,[white_per] 
     ,[male_num] 
     ,[male_per] 
     ,[female_num] 
     ,[female_per] 
FROM [RAW_demographics_20170706] 

但是,我遇到的問題是,沒有價值的單元格,有文本,而不是空單元格。所以,隱式轉換不能將數據轉換爲int/float。有沒有辦法修改SELECT語句將非數字單元格的值更新爲NULL?如果我沒有那麼多列我將更新每一個在原始表這樣的插入工作表之前:

UPDATE [RAW_demographics_20170706] 
SET [fl_percent] = NULL 
WHERE ISNUMERIC([fl_percent]) <> 1 

我不知道是否有采取更有效的路徑。

回答

2

你想使用一個case語句,因爲您的錯誤應該由空字符串不是一個實際的NULL

SELECT 
     [DBN] 
     ,[Name] 
     ,[schoolyear] 
     ,case when [fl_percent] = '' then 0.0 else fl_percent end 
     ,case when [frl_percent] = '' then 0.0 else flr_percent end 
     ... 
     ... 
     ,case when [grade12] = '' then 0 else grade12 end 
     ... 
FROM [RAW_demographics_20170706] 

我也不會爲這種情況下使用ISNUMERIC到來。它會導致問題,因爲它對於除int或float之外的其他情況的數組返回true。

這些返回true,但將無法轉換:

select isnumeric('$') 
select isnumeric('1e4') 
etc... 
1

這就是TRY_CAST用於:「如果轉換成功,則返回轉換爲指定數據類型的值;否則返回null」。

+0

肯定。 try_cast適合這種情況。 – ViKiNG

+0

那麼我需要每列的TRY_CAST語句嗎? – apkim221