سؤال

وأنا إدخال مجموعة من الصفوف الجديدة في جدول الذي يعرف كما يلي:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top