2017-07-06 55 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