PDA

View Full Version : يك insert خاص



mrm0101
یک شنبه 26 دی 1389, 00:46 صبح
سلام . قبلش بگم هرچي سايت رو گشتم چنين موضوعي رو پيدا نكردم

فرض كنيد يك جدول داريد داراي يك فيلد بنام F و يك ميليون ركورد . محتويات فيلد بصورت زير مي باشد



a#12#555#4484#11922#5854#8588#21821#215421
b#12#55#4544#11252#5454#8288#21521#2122221
c#12#5785#4454#11222#5554#8488#21221#21221
d#12#5255#4244#11222#5254#8188#21221#21221



حدود بيست آيتم كه با دستور شارپ # از هم جدا شده اند و همه يكسان مي باشنذد از نظر تعداد #

حال مي خواهيم با دستور select * into اين فيلد ها كه با # جدا شده است را جدا و در جدول B كه جديد مي سازيم و داراي 20 فيلد و همان تعداد ركورد است بريزيم . آيا كسي از دوستان با اس كيو ال چنين كاري كرده است يا نه
البته با دلفي برنامه اش رو نوشته ام ولي سرعت اجراي اس كيو ال يه چيز ديگه است .
با تشكر

m_omrani
یک شنبه 26 دی 1389, 17:39 عصر
اگه واقعاً هر رکورد فقط از تعدادی آیتم که با علامت شارپ از هم جدا شدن تشکیل شده و نه چیز دیگه:

اگه یک تک رکورد رو بخواید منتقل کنید هر کدوم رو می تونید با Dynamic SQL به این صورت در جدول مقصد درج کنید:

declare @f varchar(200)
declare @sql varchar(max)
select @f = f from SourceTable where pk = @pk

set @sql = 'insert into TargetTable(f) values (''' + replace(@f,'#','''),(''') + ''')'
execute @sql


اگر تمام رکوردهای جدول رو می خواید یکباره درج کنید می تونید این کار رو بکنید:

set @sql = stuff(
(select '#'+f from SourceTable for xml path('')),1,1,'')

set @sql = 'insert into TargetTable(f) values (''' + replace(@sql,'#','''),(''') + ''')'
execute @sql

mrm0101
یک شنبه 26 دی 1389, 22:05 عصر
سلام . مي شه بگيد اين كد چه كاري انجام مي دهد . منظور من جدا سازي فيلد هايي كه با # از هم جدا شده اند و كپي اطلاعات در جدول جديد كه به تعداد # فيلد دارد

m_omrani
یک شنبه 26 دی 1389, 22:41 عصر
البته یادم رفت بگم. کُد بالا تو SQL Server 2008 جواب می ده (برای SQL Server 2005 و ما قبل یه تغییر کوچیک لازم داره).

همون طور که می دونید اگه می خواستید دستی اعداد رو insert کنید باید چنین کاری انجام می دادید:

insert into TargetTable(f) values (555),(4484),(11922),(5854), ...

من کاری که کردم در رشته ای مثل

555#4484#11922#5854#8588#21821#215421

علامت # رو با رشته " '),(' " جایگزین (Replace) کردم. بعد به سر و ته رشته به دست اومده عبارت های لازم رو اضافه کردم تا بتونم اسکریپت insert نهایی رو بسازم. بعد هم اونو execute کردم.