View Full Version : کپی یک رکورد
seniamail
یک شنبه 28 آبان 1391, 10:12 صبح
سلام
من از دستور زیر برای کپی یک رکورد استفاده میکنم
insert t1 select * from t1 where id='?'
این دستور مشکلی نداره ولی فقط در جداولی که آی دی اتوماتیک میگیرن خطا میده.
چطوری میتونم آی دی رو در قسمت select استثناء کنم. یعنی بگه تمام فیلد ها رو اضافه کن الا آی دی رو؟
چون تعداد فیلد ها خیلی زیاده و امکان تغییرشون بعده ها هست نمیشه تک تک اونها رو تعریف کنم و ممکنه درصد خطا بالا بره
zarifcomputer
یک شنبه 28 آبان 1391, 11:06 صبح
سلام
اینو تست کن ببین مشکلت حل میشه؟
DECLARE @FieldName varchar(Max),@Fields varchar(Max);
DECLARE MyCursor CURSOR FOR
select name from sys.columns where object_id =
(select object_id from sys.objects where name = 'TblSource')
and not is_identity = 1
set @Fields = '';
OPEN MyCursor;
FETCH NEXT FROM MyCursor INTO @FieldName;
WHILE @@FETCH_STATUS = 0
BEGIN
set @Fields = @Fields + @FieldName +' , ';
FETCH NEXT FROM MyCursor INTO @FieldName;
END
CLOSE MyCursor;
DEALLOCATE MyCursor;
Exec('Insert into TblDestination Select '+@Fields+' from TblSource where id = ''?''')
seniamail
سه شنبه 07 آذر 1391, 15:53 عصر
ممنون
فقط توی خط آخر روی from خطا میگیره
Incorrect syntax near the keyword 'from'
baktash.n81@gmail.com
سه شنبه 07 آذر 1391, 16:47 عصر
همون روشی که خودتون نوشتین درسته تره ... فقط بجای * اسم فیلد ها رو بنویسید و اسم اون فیلدی که Identity هست رو ننویسید ... به طبع اسم فیلدها رو باید جلوی Insert هم بنویسید.
zarifcomputer
سه شنبه 07 آذر 1391, 18:15 عصر
ممنون
فقط توی خط آخر روی from خطا میگیره
Incorrect syntax near the keyword 'from'
به اسم های استفاده شده توجه کنید . من اسم جداول شما را نمیدونستم و به همین دلیل از اسمهای TblSource برای جدول مبدا و TblDestination برای جدول مقصد استفاده کردم. برای اصلاح باید اسم جدول های مبدا و مقصد را خودتون اصلاح کنید . این Query به صورت هوشمند فیلد های غیر Identity را تشخیص میده
mohsen24000
سه شنبه 07 آذر 1391, 18:40 عصر
این دستور مشکلی نداره ولی فقط در جداولی که آی دی اتوماتیک میگیرن خطا میده.
SET IDENTITY_INSERT t1 ON
Go
insert t1 select * from t1 where id='?'
Go
SET IDENTITY_INSERT t1 OFF
Go
با این شیوه روی فیلد AutoInc خطا نمی گیره...
seniamail
چهارشنبه 08 آذر 1391, 10:35 صبح
به اسم های استفاده شده توجه کنید . من اسم جداول شما را نمیدونستم و به همین دلیل از اسمهای TblSource برای جدول مبدا و TblDestination برای جدول مقصد استفاده کردم. برای اصلاح باید اسم جدول های مبدا و مقصد را خودتون اصلاح کنید . این Query به صورت هوشمند فیلد های غیر Identity را تشخیص میده
نه به اسم جدول نیست. اسامی جداول رو تغییر دادم! ولی باز هم ارور داره!
zarifcomputer
چهارشنبه 08 آذر 1391, 11:10 صبح
نه به اسم جدول نیست. اسامی جداول رو تغییر دادم! ولی باز هم ارور داره!
بله حق با شماست
اصلاح شد . از کد زیر استفاده کنید:
DECLARE @FieldName varchar(Max),@Fields varchar(Max);
DECLARE MyCursor CURSOR FOR
select name from sys.columns where object_id =
(select object_id from sys.objects where name = 'TblSource')
and not is_identity = 1
set @Fields = '';
OPEN MyCursor;
FETCH NEXT FROM MyCursor INTO @FieldName;
WHILE @@FETCH_STATUS = 0
BEGIN
set @Fields = @Fields + ' , '+@FieldName;
FETCH NEXT FROM MyCursor INTO @FieldName;
END
CLOSE MyCursor;
DEALLOCATE MyCursor;
set @Fields = SUBSTRING(@Fields,4,len(@Fields));
exec('Insert into TblDestination Select '+@Fields+' from TblSource where id = ''?''')
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.