PDA

View Full Version : جستجوی یک مقدار در کل دیتابیس



sadaf_
شنبه 07 مرداد 1391, 18:42 عصر
سلام
من می خوام یک مقداری رو در کل دیتابیس بگردم و به دست بیارم اطلاعات مربوط به اون را
مثلا متن مورد نظرم درآمد هستش
حالا در یک دیتابیس مشخص نام جدول ، نام فیلد و مقدار primariKey آن را به من می دهد

sadaf_
شنبه 07 مرداد 1391, 19:34 عصر
این نمونه را پیدا کردم ولی فقط نام جدول و نام فیلد رو بهم می ده
من می خوام مقدار primarikey ها را هم به دست بیارم



set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go



ALTER PROC [dbo].[SearchAllTables]
(
@SearchStr nvarchar(100)
)
AS
BEGIN
CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)

WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)

IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC
(
'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END

SELECT ColumnName, ColumnValue FROM #Results
END





دوستان خواهشمندم کمکم کنید

mas'oud
شنبه 07 مرداد 1391, 21:01 عصر
سلام
اگر اشتباه نکنم:
شما دستوری می خواهید که مقادیر زیر را برای یک عبارت فرضی پیدا کند:
نام جدول و مقدار کلید

درست فهمیدم؟

sadaf_
شنبه 07 مرداد 1391, 21:05 عصر
سلام
اگر اشتباه نکنم:
شما دستوری می خواهید که مقادیر زیر را برای یک عبارت فرضی پیدا کند:
نام جدول و مقدار کلید

درست فهمیدم؟
بله دقیقا
دستوری که در بالا گذاشتم نام ستون و نام جدول رو می ده
یا این روش را باید اصلاح کنم یا باید روش رو عوض کنم
خیلی سرچ کردم لطفا کمکم کنید
ممنون

mas'oud
شنبه 07 مرداد 1391, 21:27 عصر
ببینید، با این دستور میتونید نام فیلد کلید یک جدول را پیدا کنید، سپس با استفاده از اون مقدار کلید یک عبارت را بیابید :

SELECT column_name
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE OBJECTPROPERTY(OBJECT_ID(constraint_name), 'IsPrimaryKey') = 1
AND table_name = 'table_name'

به جای table_name باید نام جدولی که در بالا پیدا کردید رو قرار بدید که فکر میکنم به صورت sub query در میاد. یعنی به جای نام جدول، دستوری که نام جدول رو پیدا میکنه رو قرار بدید (البته customize باید بشه)
اگه نتونستید بگید تا جواب کاملتری براتون آماده کنم.

sadaf_
شنبه 07 مرداد 1391, 21:32 عصر
این دستور فقط نام ستون فیلد کلید شده را به من می ده
اما من مقدارش رو باید به دست بیارم
حالا این دستور رو چطوری به اون دستورات باید اضافه کنم؟
ممنون

mas'oud
شنبه 07 مرداد 1391, 21:47 عصر
خب منم گفتم که این دستور نام فیلد (ستون) کلید یک جدول رو میده.
شما که الان نام جدول رو دارید، با استفاده از اون نام فیلد کلید شده را بدست میارید:


SELECT column_name
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE OBJECTPROPERTY(OBJECT_ID(constraint_name), 'IsPrimaryKey') = 1
AND table_name = 'table_name'


حالا که نام ستون کلید رو بدست آوردید، با توجه به مقداری که جستجو میخواهید بکنید، مقدار فیلد کلید آن را هم با یک دستور ساده میتونید بدست بیارید،
البته نا گفته نماند کل جواب سوال شما به صورت تودرتو درمیاد محاوره ایش اینجوری میشه:

SELECT1 (SELECT2) FROM SELECT3 WHERE SELECT4='مقدار جستجو شونده'

در دستور بالا:
SELECT1: همان دستوری است که مقدار فیلد کلید یک عبارت سرچ شده را برمیگرداند.
SELECT2: دستوری که نام فیلد کلید را برمیگرداند. خود این دستور یک SELECT دیگه مثلا SELECT5 دارد که نام جدول را برمیگرداند که در پست قبلیم گفتم
SELECT3: اینم همان دستوریه که نام جدول را برمیگرداند.مانند SELECT5
SELECT4: این هم دستوریه که نام فیلدی را برمیگرداند که مقداری که دارید جستجو میکنید داخل اونه.

از بین اینا شما SELECT3,4 را بدست آوردید و من SELECT2 را برایتان نوشتم که با SELECT1,5 ترکیب شدند و این عبارت بدست اومد.
حالا نمیدونم میتونید خودتون ترکیبشو بنویسید یا با مشکل مواجهید! اگر نتونستید من سعی میکنم بنویسم.

sadaf_
شنبه 07 مرداد 1391, 21:51 عصر
می شه زحمت ترکیب را هم بکشید چون من در توانایی ام نیست
ممنونم

Galawij
شنبه 07 مرداد 1391, 21:52 عصر
سلام،
این لینک (http://barnamenevis.org/showthread.php?282871-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%DA%A9%D9%84%DB%8C%D8%AF-%D8%A7%D8%B5%D9%84%DB%8C-%D8%AC%D8%AF%D8%A7%D9%88%D9%84) رو هم نگاهی کنید، فیلد کلید اصلی رو بهتون می ده که می تونید مقدارش رو Select کنید.

mas'oud
شنبه 07 مرداد 1391, 21:57 عصر
می شه زحمت ترکیب را هم بکشید چون من در توانایی ام نیست
ممنونم

تا یکی دو ساعت دیگه سعی میکنم انجام بدم.

sadaf_
شنبه 07 مرداد 1391, 22:06 عصر
سلام،
این لینک (http://barnamenevis.org/showthread.php?282871-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%DA%A9%D9%84%DB%8C%D8%AF-%D8%A7%D8%B5%D9%84%DB%8C-%D8%AC%D8%AF%D8%A7%D9%88%D9%84) رو هم نگاهی کنید، فیلد کلید اصلی رو بهتون می ده که می تونید مقدارش رو Select کنید.
اگر یک جدول 2 تا کلید داشته باشه را نمایش نمی ده فقط یکی از اونها را نمایش می ده
بعضی از جداول من 2 کلید دارند

mas'oud
شنبه 07 مرداد 1391, 22:37 عصر
خیلی ببخشید خانم _sadaf ولی پراسیجری که شما برای پیدا کردن نام جدول و نام ستون نوشته اید، چند مقدار بر میگرداند که نمیتوان از اون برای دستوری که من نوشتم استفاده کرد.
یک راه داریم:
دستور شما رو برگزیده و قسمت پیدا کردن فیلد کلید را به آن اضافه کنیم. که الان اصلا ذهنم نمیکشه انجام بدم!!! یعنی فردا!

sadaf_
شنبه 07 مرداد 1391, 22:40 عصر
با تشکر از زحمات شما
جنابmas'oud (http://barnamenevis.org/member.php?124717-mas-oud)
من هم می خواستم به دستورم اضافه کنم اما نتونستم

sadaf_
یک شنبه 08 مرداد 1391, 13:38 عصر
با چه دستوری می تونم که فقط نام جداول رو به دست بیارم؟
یعنی مقدار رو بدم و اون هم بگه در چه جداولی این مقدار وجود داره

mas'oud
یک شنبه 08 مرداد 1391, 22:11 عصر
سلام،
بابت تاخیر عذرخواهی میکنم.
ببینید سوالتون رو خوب روش فکر کنید آیا امکان پذیره!؟
شما میخواهید یک عبارت فرضی، مثلا 'بستنی' رو سرچ کنید و نام جدولی که این مقدار درونش هست رو بدست بیارید. خب ممکنه چند جدول همچین چیزی رو داخل خودشون داشته باشند که در این صورت به جای یک نتیجه چند نتیجه داریم.
حالا من داشتم روی اون پراسیجر شما کار میکردم که بتونه فیلد کلید هم برای هر جدولی رو نشون بده. البته منم یجورایی مبتدیم و شاید کارم طول بکشه!!!

sadaf_
دوشنبه 09 مرداد 1391, 01:36 صبح
بله دقیقا درسته
اون قسمت رو باید به واسطه حلقه به یک جدول مجازی بریزیم