sql查询相同数据 序号递增,SQL插入时递增序号

博客探讨了在SQL Server 2005中插入多行数据并递增特定字段的方法,不使用标识列。给出示例表和数据,分析当前插入数据时序列号递增问题,提供了使用CTE编号和简化版的解决方案,以实现序列号正确递增。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Is there a simple way to insert multiple rows and increment a particular field, using SQL Server 2005?

Note, I am not looking for a solution involving an identity column - see the bottom of the question for an explanation

(The following schema and data have been replicated here in this SQLFiddle.)

For instance, consider the following table and data...

CREATE TABLE #TEMPTABLE (

[PKID] INT IDENTITY, [FKID] INT, [MYTEXT] VARCHAR(10), [SEQUENCE] INT

)

INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE]) VALUES (1, 'one', 1)

INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE]) VALUES (1, 'two', 2)

-- Table data

PKID FKID MYTEXT SEQUENCE

1 1 one 1

2 1 two 2

And the following data to be inserted...

DECLARE @FKID INT

SET @FKID = 1

DECLARE @NEWDATA XML

SET @NEWDATA = 'threefour'

Can the following be written in such as way that the SEQUENCE field comes out as 1,2,3,4 instead of the 1,2,3,3 that is currently does?

INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE])

SELECT @FKID,

X.value('.','VARCHAR(10)'),

(SELECT ISNULL(MAX([SEQUENCE]),0)+1 FROM #TEMPTABLE WHERE [FKID]=@FKID)

FROM @NEWDATA.nodes('/data/text') AS X(X)

-- Actual result...

PKID FKID MYTEXT SEQUENCE

1 1 one 1

2 1 two 2

3 1 three 3

4 1 four 3

-- Required result...

PKID FKID MYTEXT SEQUENCE

1 1 one 1

2 1 two 2

3 1 three 3

4 1 four 4

Update:

In response to the comment by @marc_s...

Identity would be the best solution for 2005... best solution by far - why do you explicitly exclude it and insist on rolling your own? (with all the risks of causing duplicates and so on....)

The table in question will hold multiple sets of SEQUENCE values, each "set" based on the FKID value... therefore the table could hold data along these lines...

PKID FKID MYTEXT SEQUENCE

1 1 one 1

2 1 two 2

3 1 three 3

4 1 four 4

5 2 ett 1

6 2 tva 2

7 2 tre 3

解决方案

I can't test on 2005, but you should be able to use a CTE just fine to number things;

DECLARE @FKID INT

SET @FKID = 1

DECLARE @NEWDATA XML

SET @NEWDATA = 'threefourfive'

;WITH cte AS (SELECT @FKID FKID, X.value('.','VARCHAR(10)') a,

ROW_NUMBER() OVER (ORDER BY X) r

FROM @NEWDATA.nodes('/data/text') AS X(X))

INSERT INTO TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE])

SELECT fkid, a,

(SELECT ISNULL(MAX([SEQUENCE]),0)+r FROM TEMPTABLE WHERE [FKID]=cte.fkid)

FROM cte;

SELECT * FROM TEMPTABLE;

which gives the result:

1 1 one 1

2 1 two 2

3 1 three 3

4 1 four 4

5 1 five 5

UPDATE

If the query will ever insert only one FKID, the following simplified version would work as well (the necessary changes to your current query are highlighted):

INSERT INTO #TEMPTABLE ([FKID], [MYTEXT], [SEQUENCE])

SELECT @FKID,

X.value('.','VARCHAR(10)'),

(SELECT ISNULL(MAX([SEQUENCE]),0)+1 FROM #TEMPTABLE WHERE [FKID]=@FKID)

+ ROW_NUMBER() OVER (ORDER BY (SELECT 1))

FROM @NEWDATA.nodes('/data/text') AS X(X)

The purpose of (SELECT 1) in the ROW_NUMBER's ORDER BY clause is to avoid specifying any particular order. It can be changed to something else (e.g. to X.value('.','VARCHAR(10)'), if necessary.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值