SQL Server - INSERTdan so'ng qaytadigan qiymat

INSERT-bayonnomadan so'ng key-qiymatni qaytarishga harakat qilaman. Misol: Menda atributlar nomi va id bilan jadval bor. id ishlab chiqarilgan qiymatdir.

    INSERT INTO table (name) VALUES('bob');

Endi men bir qadamda idishni qaytarishni xohlayman. Bu qanday amalga oshiriladi?

Biz Microsoft SQL Server 2008 dan foydalanmoqdamiz.

211
qo'shib qo'ydi muallif Vladimir Vagaytsev, manba
Bu erda menda foydali javob topildi: [tayyor-stavkalari bilan qaytariladigan-ishlab chiqarilgan kalitlar] [1] [1]: stackoverflow.com/questions/4224228/…
qo'shib qo'ydi muallif Lars Ladegaard, manba

10 javoblar

Ayrim SELECTga ehtiyoj qolmaydi ...

INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');

Bu esa, IDENTITY ustunlari (GUID kabi) uchun ham ishlaydi

343
qo'shib qo'ydi
Hey, SO/SEga berdingizmi? Sizning so'nggi xabaringiz Dekabr 14 da berilgan. Bu faqat sharhlar.
qo'shib qo'ydi muallif abatishchev, manba
@JonnyLeeds: buni o'zgaruvchiga (agar biror jadval o'zgaruvchisi bo'lmasa) qilolmaysiz. OUTPUT mijozga yoki jadvalga o'tadi
qo'shib qo'ydi muallif gbn, manba
@hajikelist: bu juda katta masala, Tetikda SET NCOOUNT ON, odatda yordam beradi. stackoverflow.com/questions/1483732/set-nocount-on-usage ga qarang.
qo'shib qo'ydi muallif gbn, manba
Hech qachon @ IDENTITY foydalanmang. SCOPE_IDENTITY, ha, lekin hech qachon @ IDENTITY. Bu ishonchsizdir
qo'shib qo'ydi muallif gbn, manba
Bir oz batafsil gaplasha olasizmi? Chiqish bu misolda qayerda bo'ladi? Hujjatlar faqat jadvallar uchun misollarni ko'rsatadi (chiqdi orqali ...) ). Ideal holda, uni o'zgaruvchiga aylantirmoqchiman
qo'shib qo'ydi muallif Jonny Leeds, manba
@@ IDENTITY va boshqalarni ham ishlatishingiz mumkin. Va qoidalar muhim! (qiyin yo'lni topdi ..)
qo'shib qo'ydi muallif Z. Khullah, manba
@gbn Men roziman - Triggerlar juda keng tarqalgan. NOCOUNT sozlamalarini to'g'rilashga ishonchim komil emas, iltimos, ushbu msdn postidan chuqur tushuntirish uchun o'qing.
qo'shib qo'ydi muallif hajikelist, manba
Afsuski, bu stolga tetik qo'yish uchun sizning so'zlaringizni buzishingiz mumkinligiga ishonsangiz bo'ladi! qayta: blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/…
qo'shib qo'ydi muallif hajikelist, manba

Yangi ID qiymatini olish uchun SCOPE_IDENTITY() dan foydalaning

INSERT INTO table (name) VALUES('bob');

SELECT SCOPE_IDENTITY()

http://msdn.microsoft.com/en-us/library/ms190315.aspx

126
qo'shib qo'ydi
@ liho1eye - OP, hisobga olish ustunini id deb nomlanadi, shuning uchun ha.
qo'shib qo'ydi muallif Curt, manba
id deb hisoblasa, identifikator hisoblanadi
qo'shib qo'ydi muallif Ilia G, manba
Katta tizimda, agar bir nechta sql bir vaqtning o'zida ishlamasa? Oxirgi kiritilgan idni har bir so'rovga qaytarib beradimi?
qo'shib qo'ydi muallif Shiv, manba
@Shiv "SCOPE_IDENTITY faqatgina joriy doirada joylashgan qiymatlarni qaytaradi"
qo'shib qo'ydi muallif goodies4uall, manba
INSERT INTO files (title) VALUES ('whatever'); 
SELECT * FROM files WHERE id = SCOPE_IDENTITY();

Triggerlar bilan tuzilgan jadvallarda OUTPUT moddasi mojarolari bilan bog'liq muammolar mavjudligi sababli eng ishonchlisi. Agar sizning stolingiz hozircha hech qanday tetiklenmemiş bo'lsa ham, bu juda ishonchsiz holga keltiradi - kimdir chiziqni pastga qo'shib, ilovani buzadi. Vaqt Bomba xatti-harakati.

Chuqur tushuntirish uchun msdn maqolasiga qarang:

http : //blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx

30
qo'shib qo'ydi
@hajikelist Bizning barchamiz merosimiz bor, lekin OUTPUTni almashtirish tetikleyicilari xavfi past bo'ladi, unda hamma narsa nocount hisoblanadi. Agar kimdir tetikleyici qo'shsa, u holda kodni qanday kodlashni bilishi kerak (siz asosan nazorat qilishingizni bildirasiz) yoki siz ishlab chiquvchilarni tayyorlashingiz kerak ... Ba'zi hollarda, siz SQL ning ushbu versiyasi endi boshqa joyga ko'chib ketishga majbur bo'lamiz qo'llab-quvvatlanadigan va hokazo. Shunday qilib, tetikleyiciler, natijasini bermaydi. Nima bo'lishidan qat'iy nazar, bu eng yaxshi javob emas, chunki SCOPE_IDENTITY ishlamasligi mumkin TARZDA INSTEADS ( stackoverflow.com/questions/908257/&hellip ;; )
qo'shib qo'ydi muallif gbn, manba
Triggerlar ichida MODE NOCOUNT ONni qo'shmasangizgina. Shuningdek qarang: docs.microsoft.com/en-us/sql/database-engine/configure-windo‌ ws/& hellip;
qo'shib qo'ydi muallif gbn, manba
Bu bizning @Gbn saytimiz uchun mavjud imkoniyat emas
qo'shib qo'ydi muallif hajikelist, manba
@gbn - Men bu kabi nafratli narsalardan qochmoqchiman. Men barcha ishlab chiquvchilarimga aytmoqchi emasman "," har bir tetikte mening "ilovalarimni buzmaslik" ni qo'shishni unutmang. " - buni saqlab qolishingiz mumkin. "Buning o'rniga" stsenariysi o'ta jiddiy holatdir.
qo'shib qo'ydi muallif hajikelist, manba

Entity Framework gbnning javobiga o'xshash narsani amalga oshiradi:

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');

SELECT t.[CustomerID]
FROM @generated_keys AS g 
   JOIN dbo.Customers AS t 
   ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0

Chiqish natijalari vaqtinchalik jadval o'zgaruvchisida saqlanadi va keyin mijozga qaytib tanlanadi. Gotcha haqida bilish kerak:

Qo'shimchalar bir nechta satr ishlab chiqarishi mumkin, shuning uchun o'zgaruvchining bir nechta satr bo'lishi mumkin, shuning uchun bir nechta ID

EF nima uchun vaqt jadvalini haqiqiy stolga qo'shib qo'yishini bilmayman (qaysi sharoitda ikkita mos kelmaydi).

Ammo EF nima qilmoqda.

Faqat SQL Server 2008 yoki undan yangilari. Agar u 2005 yil bo'lsa, siz omaddan qutulasiz.

12
qo'shib qo'ydi

@@ IDENTITY So'nggi kiritilgan hisobga olish qiymatini qaytaradigan tizim funktsiyasi.

7
qo'shib qo'ydi
@ IDENTITY-ni ishlatish haqida maslahat berishingiz kerak - bu aniq (juda keng) juda kam ish zarrachalari xavfsiz emas - iltimos, @Curtning SCOPE_IDENTITY() haqidagi javobiga qarang.
qo'shib qo'ydi muallif zanlok, manba

After doing an insert into a table with an identity column, you can reference @@IDENTITY to get the value: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx

5
qo'shib qo'ydi
ha, hech qachon foydalanmang. u alyans bilan ishlamaydi: X
qo'shib qo'ydi muallif H.Ghassami, manba
Hech qachon @ IDENTITY-ni ishlatmang: bu maydon xavfsiz emas: tetikler va hokazo ta'sir qiladi.
qo'shib qo'ydi muallif gbn, manba

Siz shunchaki o'zgarmaydiganga kiritilgan satrning identifikatorini tanlash uchun scope_identity-dan foydalanishingiz mumkin, keyin id-id = identifikatsiya qilish idorasidan olgan scope_identity

See here for the MSDN info http://msdn.microsoft.com/en-us/library/ms190315.aspx

3
qo'shib qo'ydi

* Parameter order in the connection string is sometimes important. * The Provider parameter's location can break the recordset cursor after adding a row. We saw this behavior with the SQLOLEDB provider.

Bir qator qo'shilgandan so'ng, Yo'l-yo'riqchi ulanish satrida birinchi parametr sifatida ko'rsatilmagan bo'lsa, satr joylari mavjud emas. Provayderi birinchi parametrdan tashqari aloqa liniyasida istalgan joyda bo'lsa, yangi kiritilgan satr maydonchalari mavjud emas. Provayderni birinchi parametrga o'tkazganimizda, satr maydonlari sehrli ravishda paydo bo'ldi.

2
qo'shib qo'ydi
Sizning javobingizni o'zgartirish va yaxshilashingiz kerak. Hozir shovqinli va munosib javob yoki hatto urinish sifatida qarama-qarshi
qo'shib qo'ydi muallif James, manba
Ko'plab foydalanuvchilar, ehtimol, bu sahifaga kirgan bo'lishi mumkin, chunki ular faqat qo'shilgan qatorni aniqlash uchun tegishli maydonlarga ega bo'lmadi. Biz ushbu xatti-harakatni (faqatgina ulanish satrida parametrlarni tartibini o'zgartirishni darhol yangi qo'shilgan satrga kirishga imkon beradi) juda g'alati deb hisoblayman, chunki u, ayniqsa, odamlarning yangi satr raqami va o'sha qatorning boshqa joylari. Provayderni oddiy parametr sifatida qo'yish orqali muammo yo'qoladi.
qo'shib qo'ydi muallif David Guidos, manba
"Shovqinli" degani nimani anglatadi? Shikoyatingizni tushuntirishingiz kerak. Bu oddiy bo'lishi mumkin. Parametrlaringizning tartibini o'zgartirsangiz, bu qo'shimchadan keyin satr ma'lumotlarining mavjudligiga ta'sir qilishi mumkin.
qo'shib qo'ydi muallif David Guidos, manba
Bu savolga qanday javob berganini/so'ralgan savolga qanday javob berishini bizga ayta olasizmi? Men kepkalarga/jasadga loyiqligini his qilmayman. Agar javobingiz foydali deb topilsa, foydalanuvchilar uni ovozga qo'yadilar.
qo'shib qo'ydi muallif n__o, manba

Siz tanlagan iborani qo'shish iborasiga qo'shishingiz mumkin. Integer myInt = Stol1 (FName) qiymatlarini kiritish ('Fred'); Scope_Identity() ni tanlang; Bu skaler bajarilganida identifikatorning qiymatini qaytaradi.

0
qo'shib qo'ydi

SQL Serverda hisobga olish ustuni sifatida foydalanadigan jadvalga kiritishda OUTPUT INSERTED dan foydalanaman:

'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)
0
qo'shib qo'ydi