# Native Code > برنامه نویسی در Delphi > بانک های اطلاعاتی در Delphi >  کار با دستور Insert Into در SQl

## hadisalahi2

با سلام به همگی دوستان.
من دوتا جدول دارم که میخوام با دستور Insert into  از یک جدول داده ها را Select کرده و داخل جدول دوم بریزم.
مثلا در صورتی که تعداد فیلدها در جداول برابر یا متفاوت باشد میتوان به سادگی با دستور زیر این کار را انجام داد.

 insert into Bridgetable select ID,Name,Len,Width from TempTable

اما این دستور برای زمانی کار میکنه که مقادیر داخل جدول اول قرار دارند و به راحتی در صورت هم خوانی نوع  فیلدها در جدول دوم درج میگردد.
اما سوال من اینه که چطور میشه داده ها رو همراه به  Select و به صورت متغیر در جدول دوم درج نمود.
توضیح جداول به صورت زیر است:

جدولی که قراره داده ها در داخل اون درج بشه دارای فیلدها : کد- تاریخ، نوع،تعدادو شرح است.
اما  جدولی که قراره داده ها از اون Select بشه ، فقط فیلدهای کد و تعداد رو داره.

حالا  تاریخ ، نوع و شرح رو من داخل متغیر های جداگانه دارم و میخوام همزمان در این جدول به همراه فیلدهای کد و تعداد درج شود.

این کار در sqL قابل انجامه چون قبلا در درس پایگاه داده این کار ها رو زیاد انجام دادیم .
ولی الان دیگه با گذشت چندین سال فراموش کردم
ممنون میشم دوستان و اساتید راهنمایی کنند.
یا حق

----------


## merced

insert into Bridgetable (ID , Name , 0 , 'Comment') select ID,Name,Len,WidthString from TempTable

----------


## hadisalahi2

دوست عزیز با تشکر ولی شما منظور من رو متوجه نشدید.
در جدول BridegTabel ما 5 تا فیلد دارم . فرضا ، کد، تاریخ، نوع،تعداد و شرح.
اما در جدول TempTable ما دو تا از این فیلدها رو داریم. فقط کد و تعداد رو.
حالا چگونه مقادیر تاریخ و نوع و شرح رو همراه با دستور Select در جدول BridgeTable درج کنم.
حالا یا به هر روش و دستوری که بشه این کار رو انجام داد.
در ضمن شما فرض کن تاریخ در متغیر Dates ، نوع در متغیر Types و شرح هم در متغیر Desc می باشد.
یا حق

----------


## merced

خوب اگه نوع و شرح رو از كجا مي خواي بياري  . اگه ميتوني با يه query  جدول Temp رو بسط بدي كه نوع و شرح رو بياره خوب Select  رو از اون كوئري انجام بده

----------


## hadisalahi2

> خوب اگه نوع و شرح رو از كجا مي خواي بياري . اگه ميتوني با يه query جدول Temp رو بسط بدي كه نوع و شرح رو بياره خوب Select رو از اون كوئري انجام بده


خوب اگه قرار بود این کار رو بکنم که دیگه چه کاری به دستور Insert into Select .
همین طوری یکی یکی رکوردها رو از جدول اول میخوندم و در جدول دوم  درج میکرد.
هدف برای این کار سرعت بالا و عدم انجام کار اضافی در جداوله.
در ضمن تا جایی که یادم میاد می شد فیلدهای اضافی رو در یک تکنیک خاص در داخل Select گنجاند و اونها رو در داخل جدول دوم درج کرد.




> من اينجور متوجه دم كه شما يه جدول داري كه 3 تا فيلدداره و دومي 2 تا فيلد مي خواي اوني رو كه سه تا فيلد داره بريزي داخل اوني كه دو تا داره ؟


نه دوست عزیز شما برعکس متوجه شدی. این حالت که کاری نداره ، فقط کافیه تعداد فیلدها رو در دستور Select  به تعداد فیلدهای جدولی که قراره داده ها در اون درج بشن انتخاب کنیم.
من میخوام داده ها رو از جدولی که دو تا فیلد مشترک داره در جدولی که 4 تا فیلد داره درج کنم.
حالا دو تا فیلد رو میخوام با Select درج کنم و دو تای دیگه رو از داخل دو تا متغیر .
البته دوستان اگه روشی سریعتر و یا بهتر سراغ دارند ، معرفی کنند ممنون میشم.
یا علی

----------


## Ebrahim Asadi

از Cursor استفاده كن

----------


## hadisalahi2

> از Cursor استفاده كن


میشه لطف کنید و راهنمایی کنید. اصلا چی هست و به چه دردی میخوره؟

----------


## benyaminrahimi

کرسر برای این کار نیست وقتی از کرسر استفاده می کنیم که می خواهیم پیمایش روی رکورد ها داشته باشیم  مثلا محاسبه کاردکس یک کالا از روی برگه ها
البته خود کرسر بار سنگینی رو حافظه داره 
.... 

البتته با کرسر هم میشه انجامش داد ولی

به نظر من شما باید یک stored procedure تعریف کنید و پارامتر هایی رو که ندارید مثل تاریخ ورودی stored procedure ست کنید و دستورتون 
insert into Bridgetable (ID , Name ,tarikh) select ID,Name,
@tarikh
from temptable

میشه

----------


## merced

> خوب اگه قرار بود این کار رو بکنم که دیگه چه کاری به دستور Insert into Select .
> همین طوری یکی یکی رکوردها رو از جدول اول میخوندم و در جدول دوم  درج میکرد.
> هدف برای این کار سرعت بالا و عدم انجام کار اضافی در جداوله.
> در ضمن تا جایی که یادم میاد می شد فیلدهای اضافی رو در یک تکنیک خاص در داخل Select گنجاند و اونها رو در داخل جدول دوم درج کرد.


قبلي اشتباه گفتم .. بايد مقادير ثابت رو تو Seclect  بياري
اگه دو فيلد در جدول مقصد هست كه مي خواي مقادير ديگه اي بهش بدي 
اگر مقادير ثابتند (در اينجا  0  و Comment)  

insert into Bridgetable (ID , Name ,NumberFied , aString) select ID,Name,0,'Comment' from TempTable


و شما گفتي يكي يكي . من اينو نگفتم دقت كن گفتم Select ساده رو تبديل به يك query  كن 
به شرطي كه فيلدهايي كه كم داري از ازيك كوئري ديگه بدست مي آد



insert into Bridgetable (ID , Name ,NumberFied , aString) select * from (Selcet x , y , z, a from temp inner   Join .. . va ela akhar)

----------


## hadisalahi2

> قبلي اشتباه گفتم .. بايد مقادير ثابت رو تو Seclect  بياري
> اگه دو فيلد در جدول مقصد هست كه مي خواي مقادير ديگه اي بهش بدي 
> اگر مقادير ثابتند (در اينجا  0  و Comment)  
> 
> insert into Bridgetable (ID , Name ,NumberFied , aString) select ID,Name,0,'Comment' from TempTable
> و شما گفتي يكي يكي . من اينو نگفتم دقت كن گفتم Select ساده رو تبديل به يك query  كن 
> به شرطي كه فيلدهايي كه كم داري از ازيك كوئري ديگه بدست مي آد
> 
> 
> ...


با سلام و تشکر
البته قبلا هم عرض کردم و مقادیر توضیحات و تاریخ رو در متغیر نگهداری میکنم.
حالا اینکه شما اونها رو ثابت تعریف کردید.
حالا اون دو مقدار رو آیا Select میشناسد؟

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

----------


## merced

> مقادیر توضیحات و تاریخ رو در متغیر نگهداری میکنم.


خسته نباشيد. حالا چه جوري مي خوايد با يه دستور Insert اون مقادير (كه احتمالاً براي چند ركورد هست) رو بياريد تو جدول مقصد؟؟ با پيمايش ؟ 


ببين ما در دو سطح مختلف كار مي كنيم. يكي تو delphi  كه شما متغير دارين و يكي SQL Server
حالا چطور ميشه با يه دستور Insert Into مقادير متغير ها رو در ركوردهاي ايجاد شده توسط اين دستور ثبت كرد .. فكر نمي كنم بشه.

----------


## حسین شهریاری

سلام

این کار شدنی است.چرا که شما توی Select میتونین مقادیر ثابت را هم استفاده کنین.پس از همین قاعده استفاده کنین.برای اطمینان بیشتر توی آنالایزر بنویسید:select 1,2,3,4,'ggggg',8 ببینید چه اتفاقی میفته؟
جواب شما دوست عزیز اینه کمی بهش ور برین و توی پروژه خودتون استفاده کنین:
adoquery.sql.text:='insert into Bridgetable select ID,'+Dates+','+Types+',Tedad,sharh from TempTable'
adoquery.ExecSqlدر اصل ما اومدیم و کمبود مقادیری را که توی TempTable بوده را با مقادیر ثابت(همان متغیرهای شما) جبران کردیم

موفق باشید

----------


## hadisalahi2

> خسته نباشيد. حالا چه جوري مي خوايد با يه دستور Insert اون مقادير (كه احتمالاً براي چند ركورد هست) رو بياريد تو جدول مقصد؟؟ با پيمايش ؟


سلامت باشید.
اگه بلد بودم که سوال نمی کردم.




> ببين ما در دو سطح مختلف كار مي كنيم. يكي تو delphi  كه شما متغير دارين و يكي SQL Server
> حالا چطور ميشه با يه دستور Insert Into مقادير متغير ها رو در ركوردهاي ايجاد شده توسط اين دستور ثبت كرد .. فكر نمي كنم بشه.


ولی من مطمئن هستم که میشه.چون قبلا این کار رو انجام دادم ولی حالا یادم نمی یاد قبلا این کار رو چطوری و با چه دستوری انجام دادم.




> adoquery.sql.text:='insert into Bridgetable select ID,'+Dates+','+Types+',Tedad,sharh from TempTable'
> adoquery.ExecSql


به نظر شما اینکه dates  رو داخل کوتیشن قرار بدیم میتونه اون رو به عنوان متغیر شناسایی کنه؟
فکر کنم اینطوری فقط اونها رو به صورت رشته شناسایی کنه نا متغیر.

----------


## merced

> ولی من مطمئن هستم که میشه.چون قبلا این کار رو انجام دادم ولی حالا یادم نمی یاد قبلا این کار رو چطوری و با چه دستوری انجام دادم.


نميشه .. يادت هم نمياد

----------


## hadisalahi2

> نميشه .. يادت هم نمياد


اینجا جای کل کل کردن نیست.
حالا آدم اگه جواب مسئله ای رو نمیدونه ، دلیل نمیشه صورت مسئله رو پاک کنه
بهتره شما با ذکر یک صلوات بیخیال بشی.

خودم دارم سعی میکنم و صددرصد روشش رو پیدا میکنم.

در ضمن از سایر دوستان هم تقاضای راهنمایی دارم.
یا علی

----------


## merced

كل كل نيست و اگه يه خورده به ساختار  Insert Into   نيگاه كني مي بيني كه نميشه از يه جدول فقط دو فيلدش رو Select  كني و در دو فيلد از جدول مقصد بذاري و اون دو فيلد جدول مقصد مقادير متغير داشته باشند 

شما هم كه مي گي اين متغيرها رو تو دلفي داري . پس بايد تو يه آرايه اي چيزي باشه. 
ظاهراً نميشه . 
البته درسته كه كار نشد نداره . ولي شما يه كد يا يه برنامه با ورودي بذار،  اساتيد كمك كنند خروجي دلخواه شما رو توليد كنند . شايد من هم كه بد متوجه منظورتون شدم يه چيزي درك كردم.

----------


## حسین شهریاری

سلام

دوست گرامی آقای salahi اگه دو مقدار بالا(Dates,Type)رشته ای هستند حق باشما هست،من فراموش کردم اونا را توی سینگل کوتیشن قرار بدم.کد بالا را اصلاح و باز نویسی میکنم.
ضمنا از شما تشکر میکنم که اینقدر با جنبه هستید...!!!.!!!!

adoquery.sql.text:='insert into Bridgetable select ID,'+Quotedstr(Dates)+','+Quotedstr(Types)+',Tedad  ,sharh from TempTable'
adoquery.ExecSql  
موفق باشید
-------------------------------------------------------------------
جهان به تلاش پاداش میدهد نه به بهانه...
یا علی

----------


## hadisalahi2

adoquery.sql.text:='insert into Bridgetable select ID,'+Quotedstr(Dates)+','+Quotedstr(Types)+',Tedad  ,sharh from TempTable'

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

----------

