PDA

View Full Version : کپی سطر های یک جدول به صورتی خاص



pooria_googooli
دوشنبه 29 اسفند 1390, 00:16 صبح
سلام . دوستان من یک جدول دارم . فرض کنید 30 تا فیلد داره و 100 سطر اطلاعات وارد شده . من می خواهم تمام این صد سطر داخل همین جدول کپی شوند با این تفاوت که تنها یک فیلدشان مقدارش به جای 11 ، 12 بخورد . ضمن اینکه تعداد جدول هایی که باید این کار را برایشان بکنم زیاده نمیخوام هر دفعه اسم همه فیلد های هر جدول را بنویسم . راهی هست ؟

tiphooo
دوشنبه 29 اسفند 1390, 01:19 صبح
شما همین 100 رکورد موجود رو مجدد درج کن بعد مقدار اون فیلد رو از 11 به 12 تغییر بده
اگر قراره همیشه 100 رکورد درج بشه top 100 بگیر
برای اینکه تمام جدول update نشه و بدونی که کدوم رکوردها جدید هستند یک فیلد autonumber برای جداول در نظر بگیر و بعد از عملیات درج ، دستور update رو برای رکوردهایی بنویس که فیلد autonumber آنها صد واحد کوچکتر از آخرین رکورد وارد شده است
مقدار آخرین رکورد وارد شده رو هم از متغیر @@Scopy_identity() بگیر

pooria_googooli
دوشنبه 29 اسفند 1390, 09:54 صبح
مشکل همینجاست که این 100 متغیره . یه دفعه ممکن 200 باشه یه دفعه ممکن 20000 باشه .

tiphooo
دوشنبه 29 اسفند 1390, 18:09 عصر
خوب اینو متغیر کن مشکلی نداره

pooria_googooli
دوشنبه 29 اسفند 1390, 20:05 عصر
اگر امکانش هست یه نمونه کوئری واسم بنویس.

mahan.2002
دوشنبه 29 اسفند 1390, 20:41 عصر
سلام
اینو نوشتم اینو امتحان کن شاید دوستان راه راحت تری هم بلد باشن .. . یه سوالم از دوستان داشتم مثلا همنگام ریختن در جدول همزمان فیلد مورد نظر تغییر کنه ..

select * into TBL2 from TB1
select @C= count(id) form TB1
while @i < @C
begin
UPDATE TB2
SET Feild 2 =12
WHERE Feild2=11
set @i += 1
end

pooria_googooli
سه شنبه 01 فروردین 1391, 00:33 صبح
من این را نوشتم declare @c int
declare @i int
select * into CmDet from CmDet;
select @C= count(id) from CmDet;
while @i < @C
begin
UPDATE CmDet
SET company =12
WHERE company=11
set @i += 1
end
این ارور را داد :

Msg 2714, Level 16, State 6, Line 3
There is already an object named 'CmDet' in the database.

pooria_googooli
سه شنبه 01 فروردین 1391, 00:41 صبح
راستی من یک ستون ID دارم که is identity اون yes هست .

Galawij
سه شنبه 01 فروردین 1391, 00:54 صبح
سلام،
حلقه نمی خواد، جدول Template نمی خواد!!!
تو پست دوم که کامل توضیح داده شده چیکار کنید.
این پست (http://barnamenevis.org/showthread.php?329654-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%B5%D9%81%D8%AD%D9%87-%D8%A8%D9%86%D8%AF%DB%8C&p=1450751#post1450751) را نگاه کنید کدها را گذاشتم.

mahan.2002
سه شنبه 01 فروردین 1391, 03:00 صبح
select * into CmDet from CmDet;
دوست عزیز فکر میکنم تو کدتون جدول مبدا و مقصد متفاوت یکی قرار دادید .و باید متفاوت باشه..

اگر هم جدولی بصورت دستی نساختید. میتونید با این دستور قبل از اجرا کردن کوئری تون جدول جدید از روی جدول بسازید


CREATE TABLE TB2 SELECT * FROM TB1

این لینک (http://www.plus2net.com/sql_tutorial/sql_copy_table.php) هم در مورد ساخت جدول.

mahan.2002
سه شنبه 01 فروردین 1391, 03:07 صبح
ALTERPROCEDURE [dbo].[SPS_Labs](@PageNumber SMALLINT,@PageSize SMALLINT)
SELECT*
FROM(
SELECTROW_NUMBER()over (ORDERBY IdLab)AS RowNum,IdLab, LabName, Manager, LabPhone, LabAddress, LabFax, WebSite
FROM dbo.TbLabs
)Result WHERE (RowNum >@PageSize *(@pageNumber - 1)AND RowNum <=(@PageSize * @pageNumber))

در ضمن در مورد کدی که ایشون اشاره کردن من متوجه نشدم. میشه در موردش بیشتر توضیح بدید.. چطور کار میکنه

pooria_googooli
سه شنبه 01 فروردین 1391, 13:55 عصر
select * into CmDet from CmDet;
دوست عزیز فکر میکنم تو کدتون جدول مبدا و مقصد متفاوت یکی قرار دادید .و باید متفاوت باشه..

اگر هم جدولی بصورت دستی نساختید. میتونید با این دستور قبل از اجرا کردن کوئری تون جدول جدید از روی جدول بسازید


CREATE TABLE TB2 SELECT * FROM TB1

این لینک (http://www.plus2net.com/sql_tutorial/sql_copy_table.php) هم در مورد ساخت جدول.

خب دوست عزیز من نمی خواهم متفاوت باشه . می خواهم توی خود همون جدول کپی بشه . و اینکه نمی خواهم هر دفعه اسم تک تک فیلد ها را بنویسم . چون تعداد ستون ها توی جدول هام زیاده . مشکل دیگه که قلا هم گفتم وجود یک ستون به اسم ID هست که نمیشه چیزی واردش کرد چون خودش اتوماتیک شماره واردش میشه .

mahan.2002
چهارشنبه 02 فروردین 1391, 03:06 صبح
خب دوست عزیز من نمی خواهم متفاوت باشه . می خواهم توی خود همون جدول کپی بشه . و اینکه نمی خواهم هر دفعه اسم تک تک فیلد ها را بنویسم . چون تعداد ستون ها توی جدول هام زیاده . مشکل دیگه که قلا هم گفتم وجود یک ستون به اسم ID هست که نمیشه چیزی واردش کرد چون خودش اتوماتیک شماره واردش میشه .

من متوجه سوالتون نشدم . فکر می کردم میخواهید از جدولی که دارید یک کپی یگیرید .. ولی با این تفسیر که میگید نمیخواهید اسامی فیلد هارو یکی یکی بنویسد فکری که بنظرم رسید این که شما یه کپی از جدول تون در یک جدول دیگه بگیرید .. و بعد از اون فیلد id اون جدول رو حذف کنید و با این ترتیبی که گفتید فیلد Id بصورت خودکار هست دیگه فکر نمیکنم مشکلی داشته باشین و به نظرم با همین کد می تونید رکوردهاتون رو کپی کنید .. برای تغییر مقدار فیلد تون هم بعد از ریختن رکورد ها در جدول ثانویه میتونید مقدار فیلد تون رو قبل از ریختن مجدد در جدول اولتون تغییر دهید.

pooria_googooli
چهارشنبه 02 فروردین 1391, 12:16 عصر
بله منم همین کاری که شما گفتید را انجام دادم . ولی باز هم اروری هست که فکر کنم بشه رفعش کرد . ببینید شما :
drop table temp2;
declare @c bigint ;
select @C= count(id) from CmDet2;
SELECT *
INTO temp2
FROM CmDet2;
ALTER TABLE temp2
drop column ID;
update temp2 set company='12';
SET IDENTITY_INSERT dbo.CmDet2 ON
insert into CmDet2 select * from temp2;
SET IDENTITY_INSERT dbo.CmDet2 OFF;
و این ارور را میده :

Msg 545, Level 16, State 1, Line 11
Explicit value must be specified for identity column in table 'CmDet2' either when IDENTITY_INSERT is set to ON or when a replication user is inserting into a NOT FOR REPLICATION identity column.

mahan.2002
پنج شنبه 03 فروردین 1391, 18:36 عصر
سلام دوست عزیز شما کارتو قدم به قدم انجام بده ..
اول یه Sp بساز که جدول رو کپی و فیلد id پاک کنه و همچنین مقدار فیلد که باید تغییر کنه رو نویس... بعد چک کن ببین کوئری که نوشتی درست عمل کرده و جدولتو ببین ببین کدی که نوشتی درست بوده .. و ارور نداره

بعد قدم دوم نوشتن کوئری دوم رو برای ریخت جدول تون در جدول اول بنویس ...

من فکر میکنم کد شما اینجا اشکال داره ...

SELECT *
INTO temp2
FROM CmDet2;

ALTER TABLE temp2
شما Select Into قبل Alter Table قرار دادید یعنی قبل اینکه جدولی ساخته بشه دارید رکورد داخل اون میرزید ..

و همچنین چک کنید ببنید توی هر قدم ( گام ) کار درست انجام میشه و lمثلا ببینید فیلد id تو قدم اول پاک شده یا نه ...