PDA

View Full Version : پر کردن یک جدول مجازی با 500000 داده در SQL 2000



مهدی رحیم زاده
چهارشنبه 20 مرداد 1389, 00:59 صبح
سلام
من یک جدول دارم که به صورت مجازی ایجادش کردم
می خوام اون رو با یک سری داده پر کنم و این کار رو با یک حلقه انجام میدم . برای داده های کم درست جواب میده اما وقتی تعداد داده ها زیاد می شه درست کار نمی کنه و پییغام میده .
چه راه هست که بشه این کار رو انجام داد؟
با تشکر

محمد سلیم آبادی
چهارشنبه 20 مرداد 1389, 01:19 صبح
سلام،
نیازی به حلقه و امثالهم نیست. از اونجایی که سوال را دقیق مطرح نکردین من با این تصور که می خواهید داده های آزمایشی در جدول درج کنید. این پست (http://www.30sharp.com/article/13/217/11/%d8%a7%d9%86%d8%aa%d8%b4%d8%a7%d8%b1-%d8%af%d8%a7%d8%af%d9%87-%d9%87%d8%a7%db%8c-%d8%a2%d8%b2%d9%85%d8%a7%db%8c%d8%b4%db%8c.aspx)ر ا معرفی می کنم.
فقط توجه داشته باشید که ابتدا از یکی از روش های موجود در این پست (http://www.30sharp.com/article/13/216/11/%d8%ac%d8%af%d9%88%d9%84-%da%a9%d9%85%da%a9%db%8c-%d8%a7%d8%b9%d8%af%d8%a7%d8%af.aspx)یک جدول اعداد با تعداد سطر مورد نظر ایجاد کنید (روشی را انتخاب کنید که با نسخه 2000 سازگاری داشته باشد).

اینم یک نمونه مثال:

INSERT INTO table (col1, col2, ...)
SELECT N.n, ....
FROM Number_Table AS N
WHERE n <= @n;

مهدی رحیم زاده
چهارشنبه 20 مرداد 1389, 07:39 صبح
ببینید من یک سری عدد دارم که مثلا از یک شروع میشه تا 500000 ادامه پیدا می کنه . این اعداد توی یک تیبل کم کم و به صورت نا منظم وارد می شن . این وسط یک سری عدد هستن که وارد نشدن و من میخوام که اونا رو بدست بیام .
برای این کار اومدم و یک تیبل مجازی ایجاد کردم تا اونو از یک تا 500000 پر کنم و بعد هرچی توی این هست و توی تیبل اول که توضیح دادم نیست رو با یک Query بدست بیارم .
این کار من دو تا مشکل داره :
1- پیغام میده که حافظه کم میاره
2 -اگر هم پر بشه زمان زیادی لازمه
ممنون میشم تو این مورد کمکم کنید
بازم اگه توضیحات می خواست بگیذ تا بیشتر توضیح بدم
با تشکر

sia_2007
چهارشنبه 20 مرداد 1389, 08:53 صبح
Data Generator شرکت Red Gate

محمد سلیم آبادی
چهارشنبه 20 مرداد 1389, 12:46 عصر
ببینید من یک سری عدد دارم که مثلا از یک شروع میشه تا 500000 ادامه پیدا می کنه . این اعداد توی یک تیبل کم کم و به صورت نا منظم وارد می شن . این وسط یک سری عدد هستن که وارد نشدن و من میخوام که اونا رو بدست بیام .
برای این کار اومدم و یک تیبل مجازی ایجاد کردم تا اونو از یک تا 500000 پر کنم و بعد هرچی توی این هست و توی تیبل اول که توضیح دادم نیست رو با یک Query بدست بیارم .
این کار من دو تا مشکل داره :
1- پیغام میده که حافظه کم میاره
2 -اگر هم پر بشه زمان زیادی لازمه
ممنون میشم تو این مورد کمکم کنید
بازم اگه توضیحات می خواست بگیذ تا بیشتر توضیح بدم
با تشکر

منظورتون از table مجازی چیه؟
شما یکبار برای همیشه این جدول را بطور دائمی ایجاد کنید و برای دفعات بعدی از آن استفاده کنید.
من جواب شما را در پست اولم دادم (به لینک ها رجوع کنید).
به هر حال ابتدا یک جدولی به نام nums ایجاد کنید از طریق اجرای کد زیر:


CREATE TABLE Nums (n INT);

سپس این کد زیر را اجرا کنید. مقدار متغیر max را به اندازه ی مورد نیاز تنظیم کنید. الان روی پانصد هزار تنظیم شده.


DECLARE @max AS INT, @rc AS INT;
SET @max = 500000;
SET @rc = 1;

INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END
INSERT INTO dbo.Nums
SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;

m_omrani
چهارشنبه 20 مرداد 1389, 16:24 عصر
شايد هم اين راه را بتوان استفاده کرد:


declare @x table(a int)
declare @max int
declare @i int
set @max = 500000
set @i = 0
while 1=1
begin
insert into @x(a)values(@i)
set @i = @i + 1
if @i = @max break
end
select a from [yourtable]
where a not in (select a from @x)

محمد سلیم آبادی
چهارشنبه 20 مرداد 1389, 16:50 عصر
شايد هم اين راه را بتوان استفاده کرد:


declare @x table(a int)
declare @max int
declare @i int
set @max = 500000
set @i = 0
while 1=1
begin
insert into @x(a)values(@i)
set @i = @i + 1
if @i = @max break
end
select a from [yourtable]
where a not in (select a from @x)

سلام دوست من،
1. بدلیل اینکه ممکنه از این کوئری به دفعات استفاده بشه. بهترین این هست که یکبار جدول کمکی اعداد را برای همیشه ایجاد کنیم.
2. کاربر ایجاد کننده تایپک به غیر کارامد بودن روش حلقه ی While اشاره کرده و نیاز به یک روش بهتری دارد که در پست قبلی این روش را بهینه شده ارائه دادم.
3. کوئری که نوشتین اشتباه است.
نسخه ی صحیح:


SELECT N FROM number_table
WHERE N NOT IN (SELECT N FROM table_name)
AND N BETWEEN 1 AND 500000;