【发布时间】:2013-03-09 22:35:40
【问题描述】:
有没有使用 SQL Server 2005 插入多行并增加特定字段的简单方法?
注意,我不是在寻找涉及 identity 列的解决方案 - 请参阅问题底部以获取解释
(以下架构和数据已复制here in this SQLFiddle。)
例如,考虑下表和数据...
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
还有下面要插入的数据……
DECLARE @FKID INT
SET @FKID = 1
DECLARE @NEWDATA XML
SET @NEWDATA = '<data><text>three</text><text>four</text></data>'
以下内容可以写成SEQUENCE 字段显示为1,2,3,4 而不是当前的1,2,3,3?
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 <-- Issue
-- Required result...
PKID FKID MYTEXT SEQUENCE
1 1 one 1
2 1 two 2
3 1 three 3
4 1 four 4
更新:
回应@marc_s 的评论...
Identity 将是 2005 年的最佳解决方案......迄今为止最好的解决方案 - 为什么您明确排除它并坚持推出自己的解决方案? (有导致重复等的所有风险......)
有问题的表将保存多组 SEQUENCE 值,每个“组”都基于 FKID 值...因此该表可以保存这些数据...
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
【问题讨论】:
-
我相信任何简单的方法都需要 SQL Server 2012。
-
是的,@Pieter,我相信这会更容易 - 不幸的是,我坚持使用 2005 年,因为这是我们支持的最低数据库,我们的许多客户仍在使用它
-
因为,@marc_s,序列与外键列直接相关。 IE。
FKID=1可以有多个行,SEQUENCE=1,2,3和FKID=2也可以有SEQUENCE=1,2。对不起,如果我没有在 OP 中说清楚 -
有什么理由你不能使用变量来做到这一点?声明它,并从您的选择语句中增加它?把变量写在最后。
-
抱歉@Random,我不完全理解如何您将使用变量...请随时为您的解决方案提供答案
标签: sql-server sql-server-2005 insert sequence