الحصول على بطاقات هوية جديدة بعد إدراج
-
03-07-2019 - |
سؤال
وأنا إدخال مجموعة من الصفوف الجديدة في جدول الذي يعرف كما يلي:
CREATE TABLE [sometable](
[id] [int] IDENTITY(1,1) NOT NULL,
[someval] sometype NOT NULL
)
وباستخدام إدراج التالية:
insert into sometable select somefield as someval from othertable
وعندما انتهيت، أود أن أعرف هوية من كافة الصفوف التي تم إدراجها حديثا. SCOPE_IDENTITY () فقط بإرجاع ID الصف الأخير إدراجها.
وكيف يمكنني الحصول على جميع معرفات جديدة؟
وسيكون أسلوب واحد أن يخطر بالبال أن يكون للاستيلاء على أكبر الهوية الحالية من sometable وSCOPE_IDENTITY () بعد إدراج، واستخدام هاتين القيمتين لتحديد من sometable. على سبيل المثال:
declare @currentMaxId int;
select @currentMaxId=MAX(id) from sometable
insert into sometable select somefield as someval from othertable
select * from sometable where id>@currentMaxId and id<=SCOPE_IDENTITY()
هل هناك نمط أفضل؟
المحلول
استخدم وظيفة الإخراج إلى الاستيلاء على جميع INSERTED إيد مرة أخرى إلى طاولة المفاوضات.
CREATE TABLE MyTable
(
MyPK INT IDENTITY(1,1) NOT NULL,
MyColumn NVARCHAR(1000)
)
DECLARE @myNewPKTable TABLE (myNewPK INT)
INSERT INTO
MyTable
(
MyColumn
)
OUTPUT INSERTED.MyPK INTO @myNewPKTable
SELECT
sysobjects.name
FROM
sysobjects
SELECT * FROM @myNewPKTable
نصائح أخرى
وإذا كنت تريد "السيطرة" في ADO.Net والحصول على هويات المسندة إلى الطفل والحصول على هويات الخلف بحيث يمكنك تحديث النموذج الخاص بك: http://daniel.wertheim.se/2010/10/ 24 / ج دفعة الهوية إدراج /
والعضو هذا Procuedure المخزنة
وهذا سيكون المفتاح الأساسي الديناميكي ..
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE sp_BulkInsertCountry
(
@FilePath varchar(1000)
)
AS
BEGIN--PROCEDURE
--variable declaration
declare @SQL varchar(500)
declare @id int
declare @CountryName varchar(30)
--Create temporary table for Country
CREATE TABLE #tmpCountry
(
CountryName varchar(30),
)
---executing bulk insert on temporary table
SET @SQL='BULK INSERT #tmpCountry from ''' + @FilePath + ''' WITH (FIELDTERMINATOR ='','',ROWTERMINATOR=''\n'')'
EXEC(@sql)
DECLARE cursor_Country CURSOR READ_ONLY FOR
select [CountryName] from #tmpCountry
OPEN cursor_Country
FETCH NEXT FROM cursor_Country INTO @CountryName
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @id=isnull(max(Countryid),0) from tblCountryMaster
SET @id=@id+1
INSERT INTO tblCountryMaster values(@Id,@CountryName)
FETCH NEXT FROM cursor_Country INTO @CountryName
END
CLOSE cursor_Country
DEALLOCATE cursor_Country
END--PROCEDURE
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
رابط
لمزيد من التفاصيل زيارة التالية http://jalpesh.blogspot.com/search؟q=bulk+insert
وإنشاء جدول لتعيين كافة معرفات جديدة. ثم جعل حلقة لجميع إدراج. داخل الحلقة جعل إدراج تريد مع SCOPE_IDENTITY (). بعد إدراج الحصول على معرف جديد وأدخله في الجدول الجديد الذي أنشأته ل. في النهاية حدد * من [newTable].