ورود

View Full Version : خاموش کردن خاصیت identity و درج داده بدون ذکر تک تک ستون ها



rezaei manesh
شنبه 17 اسفند 1392, 22:20 عصر
سلام
من می خوام ستون identity رو خاموش کنم و تعدادی رکورد رو از بایگانی به جدول اضافه کنم و دوباره اون رو روشن کنم
چند نکته:
-من نمی تونم فیلدم رو حذف کنم دوباره ایجاد کنم چون مقادیرش برام مهمه
- تعداد جدول ها و فیلد ها زیاد هست و هم در حال بروز رسانی هست و اینکه نمی خوام نام ستون ها رو ردیف کنم تو کویری
- جدول ها توسط تعدادی زیادی کاربران در همان زمان در حال استفاده هست و برام مهمه که در کمترین زمان ممکن این انتقال اطلاعات انجام بشه
این کد رو نوشتم اما خطا میده

SET IDENTITY_INSERT [CurrentTable] ON
INSERT INTO [CurrentTable] SELECT * FROM [BackupTableName]
SET IDENTITY_INSERT [CurrentTable] OFF




Msg 8101, Level 16, State 1, Procedure SPGetBaygani, Line 21
An explicit value for the identity column in table 'CurrentTable' can only be specified when a column list is used and IDENTITY_INSERT is ON.

لطفا کمک کنید

N_D
یک شنبه 18 اسفند 1392, 11:33 صبح
اینجوری بنویس
INSERT INTO CurrentTable (Field1, Field2,...) SELECT Field1, Field2,... FROM BackupTableName

rezaei manesh
یک شنبه 18 اسفند 1392, 12:23 عصر
ممنون از پاسخ تون اما ای کاش به متن پرسش من هم توجه می کردین من تو نکته دوم گفتم نمی خوام فیلد هام رو ردیف کنم

fakhravari
یک شنبه 18 اسفند 1392, 20:07 عصر
به نظر درست میاد
SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] ON

INSERT INTO [MyDB].[dbo].[Equipment]
(COL1,
COL2)
SELECT COL1,
COL2
FROM [MyDBQA].[dbo].[Equipment]

SET IDENTITY_INSERT [MyDB].[dbo].[Equipment] OFF

rezaei manesh
دوشنبه 19 اسفند 1392, 09:09 صبح
دوستان بله اگه نام فیلد ها رو ردیف کنم که مشکلی نداره
من می خوام بدون در نظر گرفتن نام فیلد ها کار کنه مشکل اینه که ستون identity رو خودش نمی زاره تو دستور و چون تعداد ستون های منبع و مقصد یکی نمی شه اینجوری خطا می ده
حالا اگه من بتونم خاصیت Identity مقصد رو هم حذف کنم می تونم دستور رو اجرا کنم و بعد دوباره خاصیتش رو ست کنم

aslan
دوشنبه 19 اسفند 1392, 11:47 صبح
دوستان بله اگه نام فیلد ها رو ردیف کنم که مشکلی نداره
من می خوام بدون در نظر گرفتن نام فیلد ها کار کنه مشکل اینه که ستون identity رو خودش نمی زاره تو دستور و چون تعداد ستون های منبع و مقصد یکی نمی شه اینجوری خطا می ده
حالا اگه من بتونم خاصیت Identity مقصد رو هم حذف کنم می تونم دستور رو اجرا کنم و بعد دوباره خاصیتش رو ست کنم
سلام
در حلتی که مورد سواله شما مجبوربه ذکراسامی فیلدها هستید
میتونید اینکارو ( ذکر اسامی فیلدها ... ) با کدنویسی انجام دهید
لینک زیر را ببینید شاید کمکتون کنه

http://stackoverflow.com/questions/2005437/an-explicit-value-for-the-identity-column-in-table-can-only-be-specified-when-a

موفق باشید

aslan
دوشنبه 19 اسفند 1392, 12:13 عصر
دوستان بله اگه نام فیلد ها رو ردیف کنم که مشکلی نداره
من می خوام بدون در نظر گرفتن نام فیلد ها کار کنه مشکل اینه که ستون identity رو خودش نمی زاره تو دستور و چون تعداد ستون های منبع و مقصد یکی نمی شه اینجوری خطا می ده
حالا اگه من بتونم خاصیت Identity مقصد رو هم حذف کنم می تونم دستور رو اجرا کنم و بعد دوباره خاصیتش رو ست کنم

و لینک زیر :


http://stackoverflow.com/questions/4936634/comma-separated-list-of-all-columns-in-the-database-tablename-column-names

یوسف زالی
دوشنبه 19 اسفند 1392, 12:33 عصر
سلام.


An explicit value for the identity column in table 'TBL' can only be specified when a column list is used and IDENTITY_INSERT is ON.


این رو تست کنید:




create procedure InsertIdentity(@FromTBL varchar(50), @IntoTbl varchar(50))
as
declare @QRY varchar(max)
declare @FieldListPlaceHolder varchar(100)
declare @FieldList varchar(max)

select
@FieldListPlaceHolder = '<FILED LIST>',
@FieldList = '',
@QRY = 'SET IDENTITY_INSERT ' + @IntoTbl + ' ON' + CHAR(13) +
'insert into ' + @IntoTbl + '(' + @FieldListPlaceHolder + ')' + CHAR(13) +
'select *' + CHAR(13) +
'from ' + @FromTBL + CHAR(13) +
'SET IDENTITY_INSERT ' + @IntoTbl + ' OFF'

select
@FieldList += case ROW_NUMBER() over(order by B.Column_ID) when 1 then '' else ', ' end + B.name
from sys.tables A
join sys.columns B on A.object_id = B.object_id
where A.name = @IntoTbl

set @QRY = REPLACE(@QRY, @FieldListPlaceHolder, @FieldList)
exec(@QRY)



البته ممکنه به دلیل این که سریع نوشتم، خطاهایی داشته باشه، ران کنید، و در برنامه کافیه نام جداول رو بهش پاس بدید..
موفق باشید.

rezaei manesh
سه شنبه 20 اسفند 1392, 21:22 عصر
سلام
بسیار بسیار ممنون
با یکم تغییر مشکل من رو حل کرد
اینم تغییر یافتش


create procedure InsertIdentity(@FromTBL nvarchar(max), @IntoTbl nvarchar(50),@Id as decimal)
as
declare @QRY nvarchar(max)
declare @FieldListPlaceHolder nvarchar(100)
declare @FieldList nvarchar(max)


select
@FieldListPlaceHolder = '<FILED LIST>',
@FieldList = '',
@QRY = 'SET IDENTITY_INSERT ' + @IntoTbl + ' ON' + CHAR(13) + 'insert into ' + @IntoTbl + '(' + @FieldListPlaceHolder + ')' + CHAR(13) +
'select *' + CHAR(13) +
'from ' + @FromTBL + CHAR(13)

select
@FieldList = @FieldList + case ROW_NUMBER() over(order by B.Column_ID) when 1 then '' else ', ' end + B.name
from sys.tables A
join sys.columns B on A.object_id = B.object_id
where A.name = @IntoTbl

set @QRY = REPLACE(@QRY, @FieldListPlaceHolder, @FieldList)

exec sp_executesql @QRY
,N'@ProjectsNameId Decimal'
,@Id

set @QRY ='SET IDENTITY_INSERT ' + @IntoTbl + ' OFF'
exec sp_executesql @QRY