SQL Server 2005 を使用して、複数の行を挿入し、特定のフィールドをインクリメントする簡単な方法はありますか?
注、列を含むソリューションを探しているわけidentity
ではありません-説明については、質問の下部を参照してください
(次のスキーマとデータは、この 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