PDA

View Full Version : چطور میشه تمام جدول های یک دیتابیس رو سلکت کرد؟



kkkaka
پنج شنبه 02 شهریور 1391, 18:35 عصر
سلام به همه:چشمک:
من یه دیتا بیس دارم که توش کلی جدول دارم با نام های متفاوت ولی سلولهایی با نوع یکسان(دقیقا مثل هم).
میخوام تمام جدول هارو فارغ از نام انتخاب کنم و مثلا رکورد مبلغ که بین دو تاریخ خاص ایجاد شده رو بخونم.
چطور باید اینکار رو انجام بدم؟؟؟:متفکر:

Amirpooyan
جمعه 03 شهریور 1391, 19:19 عصر
من از سوال شما اینطور برداشت کردم که شما چندین جدول با فیلدهای مشابه در یک دیتابیس داری که می خوای Query اطلاعات را از چندین جدول استخراج کنید. اگر من مشکل شما درست متوجه شده باشم، برای این کار شما کافیه از اپراتور UNION در دستور SELECT استفاده کنید.

اپراتور UNION به شما این امکان رو میده که دو یا چندین result set رو در دستور SELECT با هم ترکیب (Combime) کنی:


SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

Amirpooyan
جمعه 03 شهریور 1391, 19:31 عصر
همچنین برای استخراج نام جدول های یک دیتابیس در SQL Server 2005, 2008, 2008 R2 می تونید از کد زیر استفاده کنید:


USE [AdventureWorks]
GO

SELECT [name]
FROM sys.Tables
GO

Amirpooyan
دوشنبه 06 شهریور 1391, 00:28 صبح
امیدوارم منظور من رو برای بکارگیری اپراتور UNION گرفته باشی. چون دیدم یه تاپیک دیگه زدی با سوال مشابه همین. یه مثال میزنم، شاید خالی از فایده نباشه:

SELECT * FROM
(
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product1]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product2]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product3]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product4]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product5]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product6]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product7]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product8]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product9]
UNION
SELECT [ProductID], [Name], [ProductNumber], [StandardCost] FROM [Product10]
) AS AllTable
WHERE [StandardCost] >= 200

توی مثال بالا، تمام result set های خروجی دستور های Select توسط اپراتور UNION ترکیب میشن، سپس شرط [StandardCost] >= 200 روی تجمیع یا ترکیب result set کل اون 10 تا جدول اجرا میشه.

kkkaka
دوشنبه 06 شهریور 1391, 14:00 عصر
امیر پویان جان مرسی از لطفت ، عزیز...
ولی مشکل اینه که برنامه من درحال زایش جدولهایی با نام های تقریبآ تصادفیه و من در حال حاظر نمیدونم چه جدولهایی تولید شدن پس باید دستورمو جوری مینوشتم که همه جدول ها سلکت بشن (مثل وقتی که سرچ میکنیم بجای نام مورد نظر * میذاریم.) به همین خاطر این دستور که شما لطف کردی برام گذاشتی کاربرد نداره.
من اومدم همزمان با دستور تولید جدول جدید اسمشو تو جدول مادر ذخیره کردم بعد اسمها رو خوندمو کارمو انجام دادم البته همین پروسه خوندن اسم ها و بررسی تک تک جدول ها خیلی وقتمو گرفت که آخر سر هم با یه کلک رشتی ! تونستم انجامش بدم(انشا الله وقتی علمم بیشتر شد از راه استاندارد درستش میکنم).
بازم ممنون که وقت گذاشتی و جوابمو دادی خیلی گلی...
موفق باشی.

Amirpooyan
دوشنبه 06 شهریور 1391, 19:54 عصر
شما مستقیما اشاره نکردید، اما ظاهرا از SQL Server استفاده می کنید، درسته؟
در SQL Server قابلیت داریم به Dynamic SQL statements که با استفاده از اون می تونید، در کد SQL، دستورات پویایی بسازید. (اگه آشنایی نداری، گوگل کن)

لیست جداول شما بقول خودتون در حال زایش هست، خب من در پست سوم همین تاپیک براتون روش بدست آوردن جداول کل یک دیتابیس رو گذاشتم. خب اگه شما یه کم SQL بلد باشید، دیگه تولید یه همچین Query آنچنان سخت نیست.

اما نکته آخر، من از سناریو پروژه ای که شما در حال پیاده سازی اون هستید، خبر ندارم. اما از همین چیزایی که گفتی به نظر میرسه (ممکنه) طراحی دیتابیس شما اشتباه باشه. چرا باید این همه جدول با ساختار مشابه داشته باشی؟!! و اینجاست که به نظر میاد شناسایی موجودیت ها (Entity) و نوع ذخیره سازی رو درست انجام ندادی.

Amirpooyan
دوشنبه 06 شهریور 1391, 23:47 عصر
وقتی داشتم پست قبلی رو می نوشتم، فرصت نداشتم کد نمونه ای بنویسم. کد T-SQL زیر رو روی هر دیتابیسی اجرا کنی، رکورد اول همه جداول موجود در اون دیتابیس رو نمایش میده.

این رو فقط بعنوان مثال برای آشنایی با Dynamic SQL statements نوشتم و از همون روشی که در پست سوم این تاپیک مطرح کردم، برای بدست آوردن نام جداول استفاده کردم:

DECLARE @tableName varchar(64)
DECLARE c CURSOR LOCAL FAST_FORWARD FOR
SELECT [name] FROM [sys].[tables]
OPEN c
FETCH NEXT FROM c INTO @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @SelectStatement nvarchar(100)
SET @SelectStatement = 'SELECT TOP (1) * FROM [' + @tableName + ']'
EXECUTE sp_executesql @SelectStatement
FETCH NEXT FROM c INTO @tableName
END
CLOSE c
DEALLOCATE c

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