View Full Version : ادغام چندین جدول
rahjoya
دوشنبه 18 اردیبهشت 1385, 07:06 صبح
چگونه میتوان تمام جداول یک بانک اطلاعاتی را پیمایش کردوتمام رکوردهای همه جداول را درون یک جدول در بانک اطلاعاتی دیگر جمع آوری کرد (همگی دارای فیلدهای یکسانند)؟
Kamyar.Kimiyabeigi
دوشنبه 18 اردیبهشت 1385, 15:03 عصر
میشه بگین برای چی میخواین همچین کاری بکنین؟ تا بشه بهتر کمکتون کرد
h_baqery
دوشنبه 18 اردیبهشت 1385, 16:12 عصر
غیر از import و export اگه از طریق کد بخواهید انجام دهید باید دوتا cursor تو در تو بنویسید که اولی نام جداول رو از جدول Sysobjects بخونه و دومی نام فیلدها رو از جدول syscolumns بخونه و دستور insert into رو از این طریق بسازید و به بانک دیگر insert into کنید .
اگر متوجه نشدید بگید بیشتر توضیح بدم یا اگر که کارتون فوریه بگید براتون کد بزارم اگرم فوری نیست بهتر که راههنمایی بشید تا خودتون بنویسید.
rahjoya
سه شنبه 19 اردیبهشت 1385, 06:37 صبح
جناب آقای کیمیا بیگی
با سلام
من در یک بانک اطلاعاتی حدود دو هزار جدول دارم که می خواهم از هر جدول تمام رکوردها را بردارم و در یک جدول دیگر بریزم در واقع میخواهم اطلاعات این دو هزار تا جدول همگی در یک جدول جمع آوری شوند. اگر منظورم واضح نیست بگوئید بیشتر توضیح دهم.
متشکرم
reza_rad
سه شنبه 19 اردیبهشت 1385, 06:41 صبح
جناب آقای کیمیا بیگی
با سلام
من در یک بانک اطلاعاتی حدود دو هزار جدول دارم که می خواهم از هر جدول تمام رکوردها را بردارم و در یک جدول دیگر بریزم در واقع میخواهم اطلاعات این دو هزار تا جدول همگی در یک جدول جمع آوری شوند. اگر منظورم واضح نیست بگوئید بیشتر توضیح دهم.
متشکرم
چرا 2000 جدول شبیه به هم؟؟!!!!!!!
union استفاده کنید البته این نکته در استفاده از union مهمه که تمام فیلدها شبیه به هم باشند
Kamyar.Kimiyabeigi
سه شنبه 19 اردیبهشت 1385, 07:45 صبح
شما هم میتونین از Cursor استفاده کنین (همانطور که دوست عزیرمون h_baqery گفتند). ولی برای 2000 تا جدول فکر کنم که کند بشه.
به نظر من شما از Export خود SQL استفاده کنین که هم راحتتر هست (Visual) و هم سریعتر (من خودم تست کردم و اطلاعات چندین جدول رو در یک جدول دیگه ریختم البته همانطور که گفتین ساختار تمام جداول مشابه هست)
rahjoya
سه شنبه 19 اردیبهشت 1385, 09:28 صبح
با استفاده از export سه تا جدول را برای نمونه به یک Destination فرستادم ، تعداد مجموع رکوردهای این سه جدول 3908 بود ولی در جدول مقصد 4008 تا رکورد وجود داشت یعنی 100 تا بیشتر. لازم به ذکر است که جداول مبدا از foxpro تبدیل شده اند و کلید اصلی ندارند و امکان اشتباه و دوباره کپی شدن یک جدول هست.
select name,type
from sysobjects این کد را در sql Analyzer نوشتم تا نام جداول را بدست آورم اما یک جدول به نام dtproperties را هم در اسامی
where type='u' جداول می آورد.
چون فیلدهای تمام جداول یکسان بود یک جدول با همین فیلدها در بانک مقصد ساختم و خواستم از طریق متغیر نام جدول را به آن بدهم ولی متغیر را نمیشناسد
(declare @st varchar(20
'select @st='Table name
insert into Allt
select * from @st
لطفا در مورد کد نویسی با استفاده از case و اینکه چرا در روش Export تعداد رکوردها زیادتر بود مرا راهنمایی کنید
Kamyar.Kimiyabeigi
سه شنبه 19 اردیبهشت 1385, 09:33 صبح
برای کار با CASE به صورت زیره
SELECT au_fname, au_lname,
CASE state
WHEN 'CA' THEN 'California'
WHEN 'KS' THEN 'Kansas'
WHEN 'TN' THEN 'Tennessee'
WHEN 'OR' THEN 'Oregon'
WHEN 'MI' THEN 'Michigan'
WHEN 'IN' THEN 'Indiana'
WHEN 'MD' THEN 'Maryland'
WHEN 'UT' THEN 'Utah'
END AS StateName
FROM pubs.dbo.authors
ORDER BY au_lname
اما چرا در روش Export تعداد رکوردها بیشتر شده :
احتمالا" در زمان انتخاب جداول اشتباه کردین (از Select All استفاده کردین) منم برای تست کار شما اول Select All رو انتخاب کرده بودم و جدول مقصد هم انتخاب شده بود و باعث شد که اطلاعات دوباره تو خودش Export بشه
rahjoya
سه شنبه 19 اردیبهشت 1385, 11:31 صبح
اما چرا در روش Export تعداد رکوردها بیشتر شده :
احتمالا" در زمان انتخاب جداول اشتباه کردین (از Select All استفاده کردین) منم برای تست کار شما اول Select All رو انتخاب کرده بودم و جدول مقصد هم انتخاب شده بود و باعث شد که اطلاعات دوباره تو خودش Export بشه[/QUOTE]
آیا منظورتان در پنجره DTS import/Export wizard است؟ در آنجا با کلیک در قسمت Source جداول را انتخاب کردم.
Kamyar.Kimiyabeigi
سه شنبه 19 اردیبهشت 1385, 11:40 صبح
آیا منظورتان در پنجره DTS import/Export wizard است؟ در آنجا با کلیک در قسمت Source جداول را انتخاب کردم.
منظور من دقیقا" همین عکسی هست که گذاشتم. اگر شما جدولی را انتخاب کنید بعدش میتونید براش Destination (که با رنگ قرمز مشخص شده) هم انتخاب کنین.
rahjoya
سه شنبه 19 اردیبهشت 1385, 12:04 عصر
منظور من دقیقا" همین عکسی هست که گذاشتم. اگر شما جدولی را انتخاب کنید بعدش میتونید براش Destination (که با رنگ قرمز مشخص شده) هم انتخاب کنین.
همین کار را انجام دادم و در Destination اسم جدولی را که ساخته بودم گذاشتم اما از select All استفاده نکردم بلکه در ستون source سه تا جدول را از بین دو هزارتا برای نمونه انتخاب کردم که نتیجه 100 تا رکورد از تعداد کل رکوردها بیشتر شده بود
Kamyar.Kimiyabeigi
سه شنبه 19 اردیبهشت 1385, 12:49 عصر
به نظر من شما یکی از اشکالات زیر رو داشتین :
1) جدول مقصد دارای 100 تا رکورد بوده و نمیدونستید (قبل از Export جدول مقصد رو TRUNCATE TABLE کنید)
2) احتمالا" جدول مقصد رو هم در قسمت Source انتخاب کردین
3) بیشتر از 3 تا جدول در قسمت Source انتخاب کردین
من بازم تست کردم و هیچ مشکلی نبود
rahjoya
سه شنبه 19 اردیبهشت 1385, 14:13 عصر
به نظر من شما یکی از اشکالات زیر رو داشتین :
1) جدول مقصد دارای 100 تا رکورد بوده و نمیدونستید (قبل از Export جدول مقصد رو TRUNCATE TABLE کنید)
2) احتمالا" جدول مقصد رو هم در قسمت Source انتخاب کردین
3) بیشتر از 3 تا جدول در قسمت Source انتخاب کردین
من بازم تست کردم و هیچ مشکلی نبود
همه اینها را چک کردم نبود.
میشه لطفا در مورد این error هم راهنمایی کنید
insert into TName(TableName
select name
from sysobjects
where xtype='u'
Server: Msg 8152, Level 16, State 2, Line 4
String or binary data would be truncated.
The statement has been terminated.
Kamyar.Kimiyabeigi
سه شنبه 19 اردیبهشت 1385, 14:26 عصر
شما در کدتون چندین اشکال Syntax ایی دارین. اگر منظورتون از TName همون نام جدول هست پس TableName چیه؟ دوم اینکه پرانتز رو نبستین. در کل اگر مقصودتون درج اطلاعات بوسیله SELECT هست براتون یک مثال گذاشتم
USE tempdb
GO
CREATE TABLE t2
(c1 NVARCHAR(100))
GO
INSERT INTO t2
SELECT NAME FROM master.dbo.sysobjects
WHERE xtype = 'u'
GO
SELECT * FROM t2
rahjoya
چهارشنبه 20 اردیبهشت 1385, 11:14 صبح
من یک جدول درست کردم و اسامی تمام جداول را در آن قرار دادم و یک کرسر روی آن ساختم تا بتوانم اسم جدول را در متغیر قرار دهم تا زمانیکه از اینزرت استفاده نکردم مشکلی نبود اما در درون آن دیگه متغیر را نشناخت. مشکل چیست؟
use Gall
(100)declare @Tablename nvarchar
declare c cursor
for
select c1
from t2
Open c
Fetch Next From c Into @TableName
While(@@Fetch_Status)<>-1
begin
insert Allt
* select
from @TableName
Fetch Next From c Into @TableName
End
Close c
DeAllocate c
(ببخشید جابجایی بعضی کرکترها شاید به دلیل copy - Paste است.)
Kamyar.Kimiyabeigi
چهارشنبه 20 اردیبهشت 1385, 12:30 عصر
امیدوارم با مثال زیر مشکلتون حل بشه (کد صحیح حلقه FETCH رو در انتها براتون گذاشتم)
USE tempdb
GO
-------STEP 1
CREATE TABLE t2
(c1 NVARCHAR(100))
GO
INSERT INTO t2(c1) VALUES('a') /*a IS TABLE NAME*/
GO
INSERT INTO t2(c1) VALUES('b') /*b IS TABLE NAME*/
GO
INSERT INTO t2(c1) VALUES('c') /*c IS TABLE NAME*/
GO
INSERT INTO t2(c1) VALUES('d') /*d IS TABLE NAME*/
GO
INSERT INTO t2(c1) VALUES('e') /*e IS TABLE NAME*/
GO
INSERT INTO t2(c1) VALUES('f') /*f IS TABLE NAME*/
GO
INSERT INTO t2(c1) VALUES('g') /*g IS TABLE NAME*/
GO
-------END OF STEP 1
-------STEP 2
CREATE TABLE Allt
(c1 NVARCHAR(100))
GO
-------END OF STEP 2
-------STEP 3
CREATE TABLE a
(c1 NVARCHAR(100))
GO
INSERT INTO a(c1) VALUES('1')
GO
CREATE TABLE b
(c1 NVARCHAR(100))
GO
INSERT INTO b(c1) VALUES('2')
GO
CREATE TABLE c
(c1 NVARCHAR(100))
GO
INSERT INTO c(c1) VALUES('3')
GO
CREATE TABLE d
(c1 NVARCHAR(100))
GO
INSERT INTO d(c1) VALUES('4')
GO
CREATE TABLE e
(c1 NVARCHAR(100))
GO
INSERT INTO e(c1) VALUES('5')
GO
CREATE TABLE f
(c1 NVARCHAR(100))
GO
INSERT INTO f(c1) VALUES('6')
GO
CREATE TABLE g
(c1 NVARCHAR(100))
GO
INSERT INTO g(c1) VALUES('7')
GO
-------END OF STEP 3
-------STEP 4
DECLARE @Tablename NVARCHAR(100)
DECLARE c CURSOR FOR
SELECT c1 FROM t2
OPEN c
FETCH NEXT FROM c INTO @Tablename
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE('INSERT INTO Allt ' +
' SELECT * FROM ' + @Tablename)
FETCH NEXT FROM c INTO @Tablename
END
CLOSE c
DEALLOCATE c
GO
-------END OF STEP 4
-------STEP 5
SELECT * FROM Allt
AminSobati
پنج شنبه 21 اردیبهشت 1385, 00:23 صبح
داشتن 2000 جدول خیلی جالبه. من در یکی از عظیم ترین نرم افزارهای اتوماسیون (Total System) کشور که حدود 400 میلیون تومان قیمت داره، نهایتا 800 جدول دیدم! پس حتما یک جای کار اشکال داره. بگذریم...
شما میتونین از INSERT... SELECT استفاده کنید. یک حلقه (و البته Cursor) داشته باشید از تمام جداول (نام جداول از Viewهای سیستمی بدست میاد)، و توسط Dynamic TSQL دستور INSERT... SELECT رو بسازید و اجرا کنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.