SQL Server - INSERT кейін қайтару мәні

INSERT-дан кейін кейінгі кілт мәнін алуға тырысамын. Мысал: Менде төлсипаттар атауы мен идентификаторы бар үстелім бар. id - жасалынған мән.

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

Енді бірдей қадамды иемденіп алғым келеді. Бұл қалай жүзеге асады?

Біз Microsoft SQL Server 2008 бағдарламасын пайдаланамыз.

211
қосылды автор Vladimir Vagaytsev, көзі
Мен мұнда дұрыс жауапты таптым: [дайындық-мәлімдеме-қайтару-жасалынған-кілттер] [1] [1]: stackoverflow.com/questions/4224228/…
қосылды автор Lars Ladegaard, көзі

10 жауаптар

Бөлек SELECT қажеті жоқ ...

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

Бұл IDENTITY емес бағандар үшін де жұмыс істейді (GUID сияқты)

343
қосылды
Hey, Сіз SO/SE-ге бергенсіз бе? Сіздің соңғы лауазымыңыз желтоқсанның 14-де жазылған. Өйткені бұл тек түсініктемелер.
қосылды автор abatishchev, көзі
@JonnyLeeds: айнымалыға айналдыра алмайсыз (кестенің айнымалы мәнін қоспағанда). OUTPUT клиентке немесе кестеге өтеді
қосылды автор gbn, көзі
@hajikelist: бұл өте шеткі жағдай, триггерте SET NCOOUNT ON көмектеседі. stackoverflow.com/questions/1483732/set-nocount-on-usage бөлімін қараңыз.
қосылды автор gbn, көзі
@@ IDENTITY пайдаланбаңыз. SCOPE_IDENTITY, иә, бірақ ешқашан @ IDENTITY. Бұл сенімсіз
қосылды автор gbn, көзі
Сіз біраз жасай аласыз ба? Шығарылым осы мысалда қайда шығады? Құжаттама тек кестелерге арналған мысалдарды (шығуды ... ). Ең дұрысы мен оны айнымалыға айналдырғым келеді
қосылды автор Jonny Leeds, көзі
@@ IDENTITY және басқаларын да пайдалана аласыз. Ал бұйрық өте маңызды! (қиын жолды анықтады ..)
қосылды автор Z. Khullah, көзі
@gbn Мен келіспеймін - триггерлер өте таралған. NOCOUNT орнатылымын түзететініне сенімдімін, терең түсініктеме алу үшін msdn постынан оқып шығыңыз.
қосылды автор hajikelist, көзі
Өкінішке орай, сіз бұған сене алмайсыз, себебі үстелге триггер қосу Сіздің пікірлеріңізді бұзады! re: blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/…
қосылды автор hajikelist, көзі

Жаңа кодты алу үшін SCOPE_IDENTITY() пайдаланыңыз

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

SELECT SCOPE_IDENTITY()

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

126
қосылды
@ liho1eye - Оп, идентификатор баған атауын id деп атайды, сондықтан иә.
қосылды автор Curt, көзі
id дегенді білдіреді
қосылды автор Ilia G, көзі
Үлкен жүйеде, егер бір уақытта көптеген SQL іске қосылса? Соңғы енгізілген идентификаторды әрбір сұрауға қайтарады ма?
қосылды автор Shiv, көзі
@Shiv «SCOPE_IDENTITY мәндерді ағымдағы аумақта ғана енгізеді»
қосылды автор goodies4uall, көзі
INSERT INTO files (title) VALUES ('whatever'); 
SELECT * FROM files WHERE id = SCOPE_IDENTITY();

Үздіксіз ставка, себебі OUTPUT баптауларымен триггерлер бар кестелерде белгілі мәселе бар. Сіздің үстеліңізде ешқандай триггерлер жоқ болса да, бұл өте сенімді емес, себебі біреуі сызықпен бірін қосу сіздің қолданбаңызды бұзады. Уақыт бомбасы мінез-құлқының түрі.

Терең түсініктеме алу үшін msdn мақаласын қараңыз:

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

30
қосылды
@hajikelist Бізде бәрі мұра, бірақ OUTPUT up-ке кедергі келтіретін триггерлердің қаупі төмен, ал қалғаны ноконт қалдырылады. Егер біреу триггер қосып жатса, олар оны кодтау әдісін білуі керек (негізінен сізде басқару бар екенін білдіреді) немесе сіздің әзірлеушілеріңізді үйрету қажет .. Бір сәтте SQL нұсқасы енді жойылған кезде көшіруге мәжбүр болады қолдау және т.с.с. сияқты триггерлер нәтиже тудырмайды. Қандай да болмасын, бұл ең жақсы жауап емес, себебі егер сізде ТАРАПТАРДЫҢ ОРЫНДЫС болса, SCOPE_IDENTITY жұмыс істемеуі мүмкін ( stackoverflow.com/questions/908257/… )
қосылды автор gbn, көзі
Тек триггерлерде SET NOCOUNT қосылмаған жағдайда ғана. Сондай-ақ, docs.microsoft.com/en-us/sql/database-engine/configure-windo‌ ws/hellip;
қосылды автор gbn, көзі
бұл біздің мұра орталары @gbn параметрі емес
қосылды автор hajikelist, көзі
@gbn - Мен осылай келмейтін нәрселерден аулақ болғым келеді. Барлық әзірлеушілерге айтқым келмейді, «Әрбір триггерге» менің қолданба мәлімдемемді бұзбаңыз «деп қосуды ұмытпаңыз.» - оны сақтай аласыз. «Орнына» сценарийі - бұл шеткі жағдайдан әлдеқайда көп.
қосылды автор hajikelist, көзі

Entity Framework gbn жауапына ұқсас нәрсе орындайды:

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

Шығу нəтижелері уақытша кесте айнымалысында сақталады, содан кейін клиентке кері таңдалады. Gotta туралы білу керек:

кірістіру бірнеше жолды жасай алады, сондықтан айнымалылар бірден көп жолды ұстай алады, сондықтан біреуден артық ID

Мен EF неге эфемералды үстелді нақты кестеге қосатындығын білмеймін (екі жағдайда неге сәйкес болмас еді).

Бірақ EF бұл жасайды.

SQL Server 2008 немесе одан кейінгі нұсқасы. Егер 2005 жыл болса, сіз сәттілікке ұшырамайсыз.

12
қосылды

@@ IDENTITY Соңғы енгізілген куәлікті қайтаратын жүйе функциясы.

7
қосылды
@ IDENTITY арқылы кез-келген уақытта кеңес беру керек - бұл нақты (өте кең) өте аз жіп қауіпсіз - SCOPE_IDENTITY() туралы @ Curt сұрағын қараңыз.
қосылды автор zanlok, көзі

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
қосылды
иә, ешқашан оны қолданбаңыз. бұл жақсы жұмыс істемейді: X
қосылды автор H.Ghassami, көзі
Ешқашан @ IDENTITY қолданбаңыз: ол аумақты қауіпсіз етпейді: триггерлер және т.б. оған әсер етеді.
қосылды автор gbn, көзі

Сіз айнымалыға кірістірілген жолдың идентификаторын таңдау үшін scope_identity функциясын пайдалана аласыз, содан кейін сол кестеден қажетті барлық бағандарды таңдаңыз, мұнда id = scope_identity

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

3
қосылды

* 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.

Жолды қосқаннан кейін, жол жолақтары қол жетімді емес, Жеткізуші қосылым жолында бірінші параметр ретінде көрсетілмеген. Провайдер бірінші параметр ретінде қоспағанда, байланыс жолында кез келген жерде болса, жаңа енгізілген жол өрісі қол жетімді емес. Провайдерді бірінші параметрге жылжытқанда, жол өрістері сиқырлы түрде пайда болды.

2
қосылды
Жауапты түзету және жақсарту қажет. Қазіргі уақытта бұл шулы және дұрыс жауап ретінде немесе тіпті әрекет жасамайды
қосылды автор James, көзі
Көптеген пайдаланушылар осы бетке кірген болуы мүмкін, себебі олар қосылған жолды анықтау үшін жарамды өрістер жоқ. Бұл мінез-құлықты біз байқадым (қосылым жолындағы параметрлердің жай-күйін өзгертіп, жаңадан қосылған жолға бірден қол жеткізуге мүмкіндік береді) соншалықты таңқаларлық, сондықтан, мен бұл қалпында еске лайық деп ойладым, әсіресе бұл адамдар жаңа жол идентификаторы мен сол жолдың басқа өрістеріне қатысты. Провайдерді жай ғана бірінші параметр ретінде қою арқылы мәселе жоғалады.
қосылды автор David Guidos, көзі
Сіз «шулы» деген нені білдіреді? Сізге шағымды түсіндіру қажет. Бұл оңай болуы мүмкін. Қосылым жолындағы параметрлердің тәртібін өзгертсеңіз, кірістіруден кейін жол деректерінің бар-жоғына әсер етуі мүмкін.
қосылды автор David Guidos, көзі
Бұл сұрақтың жауабы/сұралған сұраққа қаншалықты сәйкес келетінін айтуға бола ма? Мен бұл қалпға лайық деп ойлаймын. Егер сіздің жауабыңыз пайдалы деп есептелсе, пайдаланушылар оны дауыс береді.
қосылды автор n__o, көзі

Сіз таңдаған мәлімдемені кірістіру мәлімдемесіне қоса аласыз. Integer myInt = Table1 (FName) мәндерін кірістіру ('Fred'); Scope_Identity() параметрін таңдаңыз; Бұл орындалатын масштабтау кезінде сәйкестік мәнін қайтарады.

0
қосылды

SQL серверінде идентификатор бағаны ретінде пайдаланатын кестеге кірістіру кезінде OUTPUT INSERTED пайдаланамын:

'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
қосылды