如何修改此SQL SELECT语句以更改非数字值?

时间:2017-07-06 23:05:41

标签: sql sql-server ssis

我正在使用的数据集here

我正在使用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

我想知道是否有更有效的途径。

2 个答案:

答案 0 :(得分:2)

您想要使用案例陈述,因为您的错误应来自空字符串而非实际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 :(得分:1)

这就是TRY_CAST的用途:“如果转换成功,则返回转换为指定数据类型的值;否则返回null。”