Sql server 如何在SQL中自动递增空值

Sql server 如何在SQL中自动递增空值,sql-server,sql-server-2016,Sql Server,Sql Server 2016,下表中的NULL值用于ID字段。我想创建一个查询,将所有NULL值替换为基于表中当前的maxID的自动递增数字 | ID | OBJECT | |------------ |-------- | | 5637144579 | Obj 1 | | NULL | Obj 2 | | 5637144584 | Obj 3 | | NULL | Obj 4 | 因此,最终结果应该是 | ID | OBJECT |

下表中的
NULL
值用于ID字段。我想创建一个查询,将所有
NULL
值替换为基于表中当前的maxID的自动递增数字

| ID          | OBJECT  |
|------------ |-------- |
| 5637144579  | Obj 1   |
| NULL        | Obj 2   |
| 5637144584  | Obj 3   |
| NULL        | Obj 4   |
因此,最终结果应该是

| ID          | OBJECT  |
|------------ |-------- |
| 5637144579  | Obj 1   |
| 5637144585  | Obj 2   |
| 5637144584  | Obj 3   |
| 5637144586  | Obj 4   |
请注意,
NULL
s在每次更新后被替换为基于先前的maxID值的自动递增数字

现在,我有

SELECT
  ...
  ((select MAX(ID) from [dbo].MYTABLE) + 1 ) ID
  ...
但这会导致两个
NULL
ID值的
5637144585

尝试以下答案:

DECLARE @MYTABLE TABLE(ID BIGINT, OBJECT VARCHAR(10))

INSERT INTO @MYTABLE VALUES (5637144579,'OBJ 1')
INSERT INTO @MYTABLE VALUES (NULL,'OBJ 2')
INSERT INTO @MYTABLE VALUES (5637144584,'OBJ 3')
INSERT INTO @MYTABLE VALUES (NULL,'OBJ 4')

UPDATE A SET A.ID=B.RN
FROM @MYTABLE A,(
    SELECT *
        ,ROW_NUMBER() OVER(ORDER BY OBJECT)+(SELECT MAX(ID) FROM @MYTABLE)RN
    FROM @MYTABLE
    WHERE ID IS NULL)B
WHERE A.OBJECT=B.OBJECT

SELECT * FROM @MYTABLE
输出:

ID          OBJECT
5637144579  OBJ 1
5637144585  OBJ 2
5637144584  OBJ 3
5637144586  OBJ 4
create table #sample
    (
        ID bigint
        , [object] char(5)
    )

insert into #sample
values (5637144579, 'Obj 1')
, (NULL, 'Obj 2')
, (5637144584, 'Obj 3')
, (NULL,  'Obj 4') 
declare @max_id bigint = (select max(s.id) as id_bgn from #sample as s)

; with prelim as
    (
        select s.id
        , s.[object]
        , iif(s.id is null, 1, 0) as id_is_null
        from #sample as s       
    )
select isnull(p.id, @max_id + sum(p.id_is_null) over (order by p.[object] asc)) as id
, p.[object]
from prelim as p

解决此问题的一种方法是使用
sum
over作为空
ID
值的运行计数,并将其添加到先前的
max(ID)
值中

样本数据:

ID          OBJECT
5637144579  OBJ 1
5637144585  OBJ 2
5637144584  OBJ 3
5637144586  OBJ 4
create table #sample
    (
        ID bigint
        , [object] char(5)
    )

insert into #sample
values (5637144579, 'Obj 1')
, (NULL, 'Obj 2')
, (5637144584, 'Obj 3')
, (NULL,  'Obj 4') 
declare @max_id bigint = (select max(s.id) as id_bgn from #sample as s)

; with prelim as
    (
        select s.id
        , s.[object]
        , iif(s.id is null, 1, 0) as id_is_null
        from #sample as s       
    )
select isnull(p.id, @max_id + sum(p.id_is_null) over (order by p.[object] asc)) as id
, p.[object]
from prelim as p
回答:

ID          OBJECT
5637144579  OBJ 1
5637144585  OBJ 2
5637144584  OBJ 3
5637144586  OBJ 4
create table #sample
    (
        ID bigint
        , [object] char(5)
    )

insert into #sample
values (5637144579, 'Obj 1')
, (NULL, 'Obj 2')
, (5637144584, 'Obj 3')
, (NULL,  'Obj 4') 
declare @max_id bigint = (select max(s.id) as id_bgn from #sample as s)

; with prelim as
    (
        select s.id
        , s.[object]
        , iif(s.id is null, 1, 0) as id_is_null
        from #sample as s       
    )
select isnull(p.id, @max_id + sum(p.id_is_null) over (order by p.[object] asc)) as id
, p.[object]
from prelim as p

我认为这是一个更简单的解决方案

生成表

DECLARE @MYTABLE TABLE(ID BIGINT, OBJECT VARCHAR(10))

INSERT INTO @MYTABLE VALUES (5637144579,'OBJ 1')
INSERT INTO @MYTABLE VALUES (NULL,'OBJ 2')
INSERT INTO @MYTABLE VALUES (5637144584,'OBJ 3')
INSERT INTO @MYTABLE VALUES (NULL,'OBJ 4')
回答

DECLARE @N BIGINT

SELECT @N = Max(ID) FROM @MYTABLE

UPDATE @MYTABLE
SET @N = @N+1,
ID = @N
WHERE ID IS NULL

SELECT * from @MYTABLE

如果只想选择,只需执行以下操作:

SELECT ID, Obj FROM test
   WHERE ID IS NOT NULL
UNION
SELECT (SELECT Max(ID) FROM TEST) + ROW_NUMBER() OVER(ORDER BY OBJ) AS ID, OBJ
    FROM TEST WHERE ID is NULL;

是MySQL还是SQL Server?答案不同。@BaconBits,使用
[dbo]
表明它是Microsoft SQL Server。这不是MySQL中标识符的合法语法。我会取下标签。Stack Overflow疯狂地试图为任何有关SQL语言的问题建议mysql标记。@BaconBits,很抱歉造成混淆。这是比尔建议的SQL Server。什么版本的SQL Server?2012/2014/etc.@tarheel SQL Server 2016(SP1-CU5)为什么不使用标准连接语法?