PDA

View Full Version : تکرار زیاد یک رکورد



khadem1386
دوشنبه 21 اسفند 1391, 20:14 عصر
با سلام

این دو تا فیلد را در نظر بگیرید
Id =ndex + pk+Identyt
name=ali

می خواهم 80 رکورد به جدولم اضافه شود
اسمها همه ali است و Id همه که یکی یکی اضافه می شود.

بوسیله insert
بجای 80 خط دستور
چه query را پیشنهاد می نمایید؟
که مثلا یک جا عمل کنه یا خلاصه تر

با تشکر
از دوستان

khadem1386
دوشنبه 21 اسفند 1391, 22:48 عصر
یعنی چی از کجا می یان ؟

سوال اینه چطوری می شه 80 رکورد را یکجا ساخت در حالی که فقط ستون Id در هر رکورد متفاوت است.
و خود Id را هم که اتوماتیک جنریت می شه

بوسیله دستور
inser
یا هرچی شبیه آن

samani
سه شنبه 22 اسفند 1391, 09:22 صبح
ميتوني از دستور While استفاده كني

DECLARE @i int
SET @i = 1
WHILE @i <= 80
BEGIN
INSERT INTO TestTable([Name]) Values('Ali')
SET @i = @i + 1
END

یوسف زالی
سه شنبه 22 اسفند 1391, 12:20 عصر
سلام.
به جای حلقه می تونید از CTE هم استفاده کنید.
اما بهترین راهش این هست:


insert into TestTable
select top 80 'Ali'
from tempdb.sys.all_columns

سرعت بالاتر + لاگ کمتر

khadem1386
سه شنبه 22 اسفند 1391, 14:15 عصر
سلام.


insert into TestTable
select top 80 'Ali'
from tempdb.sys.all_columns

سرعت بالاتر + لاگ کمتر

ببخشید می شه در مورد خط آخر آن کمی توضیح بدهید.
from tempdb.sys.all_columns
نام جدول را می گذاریم TestTable
و نام فیلدهایش می شود
Id
name
Family
....
که Id متغییر است. و البته خودش خودش را پر می کند.
بغیه هم روی یک مقدار ثابت ثابت هستند.



آیا
tempdb بطور موقت توی ram
ساخته می شود؟

khadem1386
سه شنبه 22 اسفند 1391, 14:35 عصر
من این کد رانوشتم ولی اررور می ده
insert into tempdb
VALUES select top 80 'Ali'
from tempdb.sys.all_columns



Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'select'.

یوسف زالی
سه شنبه 22 اسفند 1391, 15:24 عصر
تو کد من Values داشت مگه؟؟!!
چرا توی TempDB اینسرت می کنید؟
فکر می کنم اصلا در جریان نیستید دارید چکار می کنید.
اون جداول سیستمی هستند. اجالتا شما کارتون رو راه بندازید.

توضیح:
از هر جدول دیگه ای که بیش از تعداد 80 رکورد (چون شما این تعداد می خواهید) داشته باشه می تونید استفاده کنید.
به جای ALI باید مقادیرتون رو جایگزین کنید.
موفق باشید.

khadem1386
سه شنبه 22 اسفند 1391, 16:12 عصر
تو کد من Values داشت مگه؟؟!!
چرا توی TempDB اینسرت می کنید؟
فکر می کنم اصلا در جریان نیستید دارید چکار می کنید.
اون جداول سیستمی هستند. اجالتا شما کارتون رو راه بندازید.

توضیح:
از هر جدول دیگه ای که بیش از تعداد 80 رکورد (چون شما این تعداد می خواهید) داشته باشه می تونید استفاده کنید.
به جای ALI باید مقادیرتون رو جایگزین کنید.
موفق باشید.

tempdb اشتباها بجای TestTable ،
past شده باید ببخشید.

درسته که تازه کارم ولی نه اینقدر!!!

این کد نهایی من شد
حالا یک سوال دارم آیا روشی هست که این
Null ها را کلا وارد نکنم
(این Null ها مخصوص فیلدهایی است که فعلا نمی خواهیم پر بشه

insert into TestTable
select top 8 'Ali' ,null,null,null,null,null,null,null,null,null,null ,null
from tempdb.sys.all_columns
(درست است و کار می کند ( مرسی)


آیا می شه مثلا سه تا از فیلد ها رو نام برد و بعد مقدار دهی کرد؟ مثل دستور
insert معمولی منظورمه

یوسف زالی
سه شنبه 22 اسفند 1391, 16:40 عصر
قصدی نداشتم. می بخشید. اما واقعا یک لحظه هنگ کردم..
در تعریف فیلد در جدول Default Value براش ست کنید.
برای نام بردن مثل اینسرت معمولی انجام بدید با این فرق که Values در اینجا می شه Select.

برای تشکر هم از دکمه ی تشکر استفاده کنید.

موفق باشید.

khadem1386
سه شنبه 22 اسفند 1391, 16:56 عصر
نه منظور من اینه که در قسمت اول (مثلا into ) نام سه عدد فیلد را تنظیم کنم
بعد در قسمت دوم ( مثلاvluse ) اونها را به ترتیب مقدار دهی کنم



اینکه می گوید براشون Default Value ست کنم. چی ست کنم Null؟

بعد اگر احیانا فیلد Name فیلد شماره 5 بود چطوری صداش کنم؟



یک سوال دیگه:
اگر بخواهیم بجای عدد 80 از یک variable استفاده کنم
در 2005 چه
syntaxi
داره؟

یک سوال دیگه ظاهرا top اینجا محدودیت داره و از 3749 بیشتر اثر نمی کنه
بعنوان مثال

select top 14000 'alli' ,@Receiver_ID,null,null,null,null,null,null,null,n ull,null,@purchase_ID


بچای 14000 رکورد فقط 3749
اضافه می شود

(3749 row(s) affected)

یوسف زالی
سه شنبه 22 اسفند 1391, 17:20 عصر
ببینید،
گفتم که مثل اینسرت معمولی انجام بدید و اسم هاش رو هم بنویسید.
Insert into test (F1, F3, F8) select blabla

دیفالت رو چیزی نگذارید.




declare @x int = 80

insert into TestTbl(Field1, Field5)
select 'Ali', 'Hassani'
from (
select ROW_NUMBER() over(order by newid()) as Row
from tempdb.sys.all_columns
) X
where Row <= @x

khadem1386
چهارشنبه 23 اسفند 1391, 13:20 عصر
استاد تشکر

اکنون دوتا سوال دارم:
اول اینکه چرا اصولا جدول tempdb.sys.all_columns نمی تواند بیشتر از 3749 رکورد را در خود جای دهد؟


دوم اینکه مثال من 400 رکودر اضافه کردم. چطور می تونم از عملیات خودم گذارش بگیرم که این کار انجام شده.
مثلا مثل خود گذارشی که ssms می ده ( 400 record efected)
مثلا SP بنده بتونه یک output داشته باشه که دوباره عدد 400 رکورد را که اضافه شده. برگردانه؟
مرسی

یوسف زالی
چهارشنبه 23 اسفند 1391, 17:16 عصر
ببینید مطالب رو خوب نخوندید.
گفتم که، اصولا هر جدولی که تعداد رکوردهاش از خواسته شما کمتر نباشه مناسبه.
در این مثال تعداد رکوردهای اون جدول مناسب 80 بود. اگر نه اون رو با خودش cross join کنید تا تعداد بالاتر بره. البته روش قشنگی نیست و می تونه با کد نویسی سریعتر بشه.
اگر جدولی دارید که تعداد رکوردهاش مناسب حال شماست از اون استفاده کنید.
اگرنه از این روش:


declare @n int
set @n = 1000

;with CTE as (
select 1 as N
union all
select N +1
from CTE
where N < @n
)

insert into TestTbl(F1, F2)
select 'Ali', 'Hassani'
from CTE
OPTION (MAXRECURSION 0)

برای برگردوندن تعدادی که اینسرت شد، راهی که همیشه جواب می ده (در موقعیت های موازی) استفاده از کدی شبیه به این هست:



declare @x1 int
declare @x2 int

begin tran
select @x1 = COUNT(1) from TestTbl

--do what you wanna do

select @x2 = COUNT(1) from TestTbl
commit tran

return @x2 -@x1


برای گرفتن مقدار برگشتی از SP باید مقدار Return_Value@ از SP رو در برنامه ببینید.
راه بهتری هم برای گزارش شما هست و اون استفاده از خواص شیئی هست که ازش در برنامه استفاده می کنید. مثلا ADO

khadem1386
پنج شنبه 24 اسفند 1391, 18:15 عصر
سوال دیگه که دارم:
اگر بخوایم یک جدول از آخرین رکوردهای که توسط آخرین دستور تولید شده درست کنیم آیا دستوری است؟

مثلا 80 رکورد قبلا اضافه شده و 80 رکورده الان می خواهیم از 80 رکورد جدید یک Recordset بگیریم

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

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

بنده با ADo کار می کنم ولی از نوع معمولی نه از نوع دات نت.


نکته بعد ی اینکه احتمالا این سایت مشکل فنی داره چون این باره سوم است که دارم این سوال را می نویسم و هر دفعه که برمی گردم می بینم نه سوالم پریده!!!


مرسی از دوستان

morrning
جمعه 25 اسفند 1391, 00:44 صبح
بهت پیشنهاد میکنم ازروش معکوس استفاده کنی. یعنی تو برنامت اونایی که مثلا علی نیستن رو ثبت کن. به طور خلاصه معمولا توی ماتریس های نمونه که تعداد 1 اونا زیاده میان به جای ثبت یک ها . فقط اون عناصری که صفر هستن رو ذخیره میکنن.
روش پیاده سازی هم توی کتاب ریاضیات لیدهلد جلد 2 هست که به راحتی میشه به الگوریتم تبدیلش کرد.

یوسف زالی
جمعه 25 اسفند 1391, 01:07 صبح
ببینید رویداد های ADOConnection رو مطالعه کنید.
صرف نظر از اون به عنوان یک اصل هر SP که انتخابی نداشته باشه رکورد ست هم بیرون نمی ده.
اون Select انتخاب برای خروجی نیست، بلکه ورودی Insert رو معین می کنه.
می تونید از دستور Insert + Output استفاده کنید.
مثال:



insert into YourTestTable
output inserted.*
select YourFields
from YourTable