मैं शॉन से सहमत हूं - एक पहचान कॉलम जोड़ें, और फिर कार्य आईडी के लिए एक गणना कॉलम का उपयोग करें। भले ही मैंने यहां इस तरह के एक प्रश्न का उत्तर दिया है, मैं इसे डुप्लिकेट के रूप में चिह्नित करने के बारे में निश्चित नहीं हूं। इसका कारण यह है कि आप task_id
. का उपयोग करना चाहते हैं प्राथमिक कुंजी के एक भाग के रूप में।
हालांकि, मुझे यकीन नहीं है कि यह संभव है, क्योंकि प्राथमिक कुंजी में एक गणना किए गए कॉलम को शामिल करने के लिए इसे persisted
होना चाहिए। , और किसी कारण से (मुझे लगता है कि यह यूडीएफ के उपयोग के कारण है) SQL सर्वर मुझे इसे जारी रखने की अनुमति नहीं देगा।
वैसे भी, इसके लिए मेरा प्रस्तावित समाधान यहां है:
सबसे पहले, एक फ़ंक्शन बनाएं जो कार्य आईडी की गणना करेगा:
CREATE FUNCTION dbo.GenerateTaskId
(
@Row_Id int,
@Issue_Id int,
@Issue_Sub_Id int
)
RETURNS Int
AS
BEGIN
RETURN
(
SELECT COUNT(*)
FROM dbo.Tasks
WHERE Issue_Id = @Issue_Id
AND Issue_Sub_ID = @Issue_Sub_ID
AND Row_Id <= @Row_Id
)
END
GO
फिर, गणना किए गए कॉलम के रूप में कार्य आईडी के साथ तालिका बनाएं:
CREATE TABLE dbo.Tasks
(
Row_Id [int] IDENTITY(1,1),
Issue_ID [int] NOT NULL,
Issue_Sub_ID [int] NOT NULL,
Task_Id AS dbo.GenerateTaskId(Row_Id, Issue_Id, Issue_Sub_Id),
CONSTRAINT PK_Tasks PRIMARY KEY (Row_Id)
)
GO
अब, इसका परीक्षण करें:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
परिणाम:
Row_Id Issue_ID Issue_Sub_ID Task_Id
1 12345 1 1
2 12345 1 2
3 12345 1 3
4 12345 2 1
5 12345 2 2
6 67890 2 1
7 67890 2 2
8 67890 2 3
आप रेक्सटेस्टर पर लाइव डेमो देख सकते हैं।