Sql server 如何基于列值生成ID

Sql server 如何基于列值生成ID,sql-server,Sql Server,我将提供例子和代码,我可以。假设除了[CycleStart]和[CycleEnd]数据类型之外的所有数据类型都是Varchar,我在这个阶段对此不太在意 表A由以下原始样本数据组成: +-------+---------+----------------+------------+------------+ | JobID | JobName | CycleDesc | CycleStart | CycleEnd | +-------+---------+------------

我将提供例子和代码,我可以。假设除了[CycleStart]和[CycleEnd]数据类型之外的所有数据类型都是Varchar,我在这个阶段对此不太在意

表A由以下原始样本数据组成:

+-------+---------+----------------+------------+------------+
| JobID | JobName | CycleDesc      | CycleStart | CycleEnd   | 
+-------+---------+----------------+------------+------------+
| 10003 | Run1    | January 2019   | 31/12/2018 | 31/12/2018 |
| 10005 | Run2    | December 2018  | 31/12/2017 | 31/11/2018 |    
| 10006 | Run3    | March 2019     | 31/12/2018 | 31/02/2019 |    
| 10007 | Run4    | September 2019 | 31/12/2018 | 31/09/2019 |  
| 10008 | Run5    | November 2019  | 31/12/2018 | 31/10/2019 |     
+-------+---------+----------------+------------+------------+
表B由以下样本数据组成,用于生成此数据的代码如下:

+-------+---------+---------+
| JobID | PeriodID | Entity |
+-------+---------+---------+
| 10003 | 202101   | XYZ1   |
| 10003 | 202112   | XYZ2   |   
| 10007 | 202008   | XYZ3   |   
| 10007 | 202003   | XYZ4   |   
| 10008 | 201904   | XYZ5   |   
+-------+----------+--------+

我怎样才能做到这一点?目前,我只是随机生成与[CycleStart]日期无关的ID,因此只是扭曲我的数据,但这是我能想到的唯一方法

最好的方法是创建日历表/日期维度。您可以使用此表解决此问题,并在以后将其用于其他问题。(在线搜索一些关于如何构建的示例)

如果你有这个表,那么你只需要加入这个表就可以了

e、 g


最好的方法是创建日历表/日期维度。您可以使用此表解决此问题,并在以后将其用于其他问题。(在线搜索一些关于如何构建的示例)

如果你有这个表,那么你只需要加入这个表就可以了

e、 g


@nbk im使用microsoft SQL server 2012,如果这是你的意思?@nbk im使用microsoft SQL server 2012,如果这是你的意思?
Declare  @Counter3 INT

SELECT @Counter3=1

WHILE @Counter3 <= 1000
BEGIN

INSERT INTO [dbo].[TableB]

SELECT
FLOOR(RAND()*(33979-1+1))+1 [JobID]
,CAST(ROUND(((2021 - 2019 -1) * RAND() + 2020), 0) AS VARCHAR) + RIGHT('0'+CAST(FLOOR(RAND()*(12-1+1))+1 AS VARCHAR),2) [PeriodID]
,FLOOR(RAND()*(23396-1+1))+1 [Entity]
+-------+---------+---------+
| JobID | PeriodID | Entity |
+-------+---------+---------+
| 10006 | 201812   | XYZ1   |
| 10006 | 201901   | XYZ2   |   
| 10006 | 201902   | XYZ3   |   
| 10006 | 201903   | XYZ4   |   
| 10006 | 201904   | XYZ5   |  
| 10006 | 201905   | XYZ5   |
| 10006 | 201906   | XYZ5   |
| 10006 | 201907   | XYZ5   |
| ...   | +30yrs   | ...    |
| 10006 | 204812   | XYZ5   |
+-------+----------+--------+
INSERT INTO TableB ( JobID , PeriodID)
SELECT DISTINCT A.JobID , D.TheYear * 100 + D.TheMonth 
FROM tableA A
JOIN myDateTable D
    ON D.TheDate BETWEEN CONVERT(date , A.CycleStart ,  103) AND DATEADD(YEAR,30, CONVERT(date , A.CycleStart ,  103));