【问题标题】:Cannot insert the value NULL into column 'col' - SQL Server无法将值 NULL 插入列 'col' - SQL Server
【发布时间】:2018-01-31 06:19:25
【问题描述】:

我的一个专栏中有这样的数据:我有大约 10 万条这样的记录。

            tele
            ---------

            C12345
            75784329899(c)
            75678934729(cell)
            ygasd786782399
            guisahkl#57812897
            5476783-6779834

我已编写此代码以删除所有字母并仅保留数字。哪个工作正常。

            create TABLE #TEMP
            (
            id [int] NOT NULL,
            tele [char](14),
            col [bigint] NOT NULL DEFAULT ''
            )
            ;with cte as (select top (100) N = row_number() over

            (order by @@spid) from sys.all_columns),

            data as(

            select id,tele,col

                from table1` 
                cross apply (
                    select (select C + ''
                        from (select N, substring( tele,N,1) C from cte where N <= datalength(tele)) [1]
                        where C between '0' and '9'
                        order by N
                        for xml path(''))
                        ) P(col)

                    where p.col is not null 

----------------插入到临时表中--------------- ------------

            INSERT INTO #TEMP (id,tele,col) 
            SELECT id,tele,cast(col as bigint) 
            FROM data 



            tele
            ---------

            12345
            75784329899
            75678934729
            786782399
            57812897
            54767836779834  

但是,现在我想保留所有单元格号码并仅删除垃圾(或未知字符) 我的结果应该是这样的:

                tele                           col
            -----------------------------------------------------

            C12345                          C12345
            75784329899(c)                  75784329899(c)
            75678934729(cell)               75678934729(cell)
            ygasd786782399                  786782399
            guisahkl#57812897               57812897
            5476783-6779834                 54767836779834

我已将代码修改如下:

            create TABLE #TEMP
            (
            id [int] NOT NULL,
            tele [char](14),
            col [bigint] NOT NULL DEFAULT ''
            )
            ;with cte as (select top (100) N = row_number() over

            (order by @@spid) from sys.all_columns),

            data as(

            select id,tele,col

                from table1` 
                cross apply (
                    select (select C + ''
                        from (select N, substring( tele,N,1) C from cte where N <= datalength(tele)) [1]
                        where C between '0' and '9'
                        order by N
                        for xml path(''))
                        ) P(col)

                    where p.col is not null AND

                      col NOT LIKE '%(CELL)%' 
                      OR col NOT LIKE  '%CELL%' OR col NOT LIKE '%(C)%'
                      OR col NOT LIKE '%C%' OR col NOT LIKE  '%MOBILE%'
                      OR col NOT LIKE  '%X%' OR col NOT LIKE '%EXT%'
                      OR col NOT LIKE '%XT%' OR col NOT LIKE '%EX%' 
                      OR col NOT LIKE '%/%' OR col NOT LIKE '%,%'
                               )

----------------插入到临时表中--------------- ------------

            INSERT INTO #TEMP (id,tele,col) 
            SELECT id,tele,cast(col as bigint) 
            FROM data 

但是,它向我显示了这个错误:

        Cannot insert the value NULL into column 'col', table 'tempdb.dbo.#TEMP_______________________________________________________________________________________________________________000000000125';
        column does not allow nulls. INSERT fails.

我应该如何纠正这个问题? 请帮忙。谢谢。

【问题讨论】:

  • 您在 col 列中插入了 null,但您创建的表 null 不被接受。所以发生了错误

标签: sql-server sql-server-2008-r2 sql-server-2016


【解决方案1】:

删除列col的临时表的CREATE语句中的NOT NULL约束。

【讨论】:

  • 感谢您的提示。但是,我想实现一点不同。能否请您重温一下这个问题?
【解决方案2】:
  1. 从表创建中删除 NOT NULL 约束。
  2. 如果您不想允许 NULL,则更改 INSERT 如下 ISNULL(cast(col as bigint), ''):

查询:

  INSERT INTO #TEMP (id,tele,col) 
  SELECT id,tele,ISNULL(cast(col as bigint), '')
  FROM data 

【讨论】:

    【解决方案3】:

    你可以试试这样 插入#TEMP (id,tele,col) SELECT id,tele,CAST(ISNULL(col,'') as BigInt) 来自数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2020-12-19
      • 2020-08-20
      • 2020-12-11
      • 2013-02-27
      相关资源
      最近更新 更多