जब आप एंटिटी फ्रेमवर्क का उपयोग करते हैं, तो यह OUTPUT
नई सम्मिलित आईडी मान को वापस करने के लिए आंतरिक रूप से तकनीक का उपयोग करता है
DECLARE @generated_keys table([Id] uniqueidentifier)
INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');
SELECT t.[TurboEncabulatorID ]
FROM @generated_keys AS g
JOIN dbo.TurboEncabulators AS t
ON g.Id = t.TurboEncabulatorID
WHERE @@ROWCOUNT > 0
आउटपुट परिणाम एक अस्थायी तालिका चर में संग्रहीत किए जाते हैं, तालिका में वापस शामिल हो जाते हैं, और तालिका के बाहर पंक्ति मान लौटाते हैं।
नोट: मुझे नहीं पता कि ईएफ आंतरिक तालिका में वास्तविक तालिका में वापस क्यों शामिल होगा (किन परिस्थितियों में दो मैच होंगे)।
लेकिन यही ईएफ करता है।
यह तकनीक ( OUTPUT
) केवल SQL Server 2008 या नए पर उपलब्ध है।
संपादित करें - शामिल होने का कारण
एंटिटी फ्रेमवर्क मूल तालिका में शामिल होने के बजाय केवल OUTPUT
मूल्यों का उपयोग करने के कारण वापस आ जाता है क्योंकि ईएफ इस तकनीक का उपयोग rowversion
नई सम्मिलित पंक्ति को प्राप्त करने के लिए भी करता है ।
आप विशेषता का उपयोग करकेTimestamp
अपने इकाई ढांचे के मॉडल में आशावादी संगामिति का उपयोग कर सकते हैं : conc
public class TurboEncabulator
{
public String StatorSlots)
[Timestamp]
public byte[] RowVersion { get; set; }
}
जब आप ऐसा करते हैं, तो एंटिटी फ्रेमवर्क को rowversion
नई सम्मिलित पंक्ति की आवश्यकता होगी :
DECLARE @generated_keys table([Id] uniqueidentifier)
INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');
SELECT t.[TurboEncabulatorID], t.[RowVersion]
FROM @generated_keys AS g
JOIN dbo.TurboEncabulators AS t
ON g.Id = t.TurboEncabulatorID
WHERE @@ROWCOUNT > 0
और इसे पुनः प्राप्त करने के लिए Timetsamp
आप एक खंड का उपयोग नहीं कर सकतेOUTPUT
।
ऐसा इसलिए है क्योंकि यदि टेबल पर कोई ट्रिगर है, Timestamp
तो आप जो भी करेंगे वह गलत होगा:
- प्रारंभिक सम्मिलित करें। टाइमस्टैम्प: 1
- OUTPUT क्लॉज टाइमस्टैम्प आउटपुट: 1
- ट्रिगर पंक्ति को संशोधित करता है। टाइमस्टैम्प: 2
अगर आपके पास टेबल पर ट्रिगर है तो लौटा टाइमस्टैम्प कभी भी सही नहीं होगा । इसलिए आपको एक अलग का उपयोग करना चाहिएSELECT
।
और यहां तक कि अगर आप गलत पंक्ति-बद्धता का सामना करने के लिए तैयार थे, तो एक अलग प्रदर्शन करने का दूसरा कारण यह SELECT
है कि आप rowversion
तालिका चर में शामिल नहीं कर सकते हैं :
DECLARE @generated_keys table([Id] uniqueidentifier, [Rowversion] timestamp)
INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID, inserted.Rowversion INTO @generated_keys
VALUES('Malleable logarithmic casing');
ऐसा करने का तीसरा कारण समरूपता के लिए है। UPDATE
ट्रिगर के साथ एक मेज पर प्रदर्शन करते समय , आप एक खंड का उपयोग नहीं कर सकतेOUTPUT
। UPDATE
एक के साथ प्रयास करना OUTPUT
समर्थित नहीं है, और एक त्रुटि देगा:
इसे करने का एकमात्र तरीका अनुवर्ती SELECT
कथन है:
UPDATE TurboEncabulators
SET StatorSlots = 'Lotus-O deltoid type'
WHERE ((TurboEncabulatorID = 1) AND (RowVersion = 792))
SELECT RowVersion
FROM TurboEncabulators
WHERE @@ROWCOUNT > 0 AND TurboEncabulatorID = 1
INSERT INTO Table1(fields...) OUTPUT INSERTED.id VALUES (...)
, या पुरानी विधि:INSERT INTO Table1(fields...) VALUES (...); SELECT SCOPE_IDENTITY();
आप इसे ExecuteScalar () का उपयोग करके c # में प्राप्त कर सकते हैं।