如何在MS SQL中的Convert()中使用identity()?

时间:2016-07-22 10:08:23

标签: sql-server

我正在使用MS SQL。我想使用identity()中的convert()来生成这样的内容:

  

2016071000

     

2016071001

我写了一个查询如下:

SELECT  convert(varchar,datepart(yyyy,getdate()))+
        substring(CONVERT(varchar,getdate(),112),5,2)+
        CONVERT(varchar,identity(1000,1));

但我收到的错误是

  

关键字'identity'附近的语法不正确。

2 个答案:

答案 0 :(得分:0)

一种方法是使用您需要的数字表:

;WITH cte AS (
SELECT  1000 as id,
        1 as lev
UNION ALL
SELECT  id+1,
        lev+1
FROM cte
WHERE lev < 100
)

SELECT convert(varchar,datepart(yyyy,getdate()))+substring(CONVERT(varchar,getdate(),112),5,2)+CONVERT(varchar,id)
FROM cte

这将产生100行,如:

2016071000
2016071001
2016071002
...
2016071099

另一种方法是使用序列:

CREATE SEQUENCE dbo.TestSequence  
    START WITH 1000 
    INCREMENT BY 1 ;  

然后运行:

SELECT convert(varchar,datepart(yyyy,getdate()))+substring(CONVERT(varchar,getdate(),112),5,2)+ CAST(NEXT VALUE FOR dbo.TestSequence as nvarchar(10))

输出:

2016071000

下次运行将是2016071001,依此类推。

如果您需要重启序列使用:

ALTER SEQUENCE dbo.TestSequence  
    RESTART WITH 1000 

答案 1 :(得分:0)

您也可以使用ROW_NUMBER

SELECT  
    CONVERT(VARCHAR, DATEPART(yyyy,GETDATE())) +
    SUBSTRING(CONVERT(VARCHAR,GETDATE(), 112), 5, 2) +
    CONVERT(VARCHAR, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) + 999)
FROM
    Tbl