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

پیدا کردن یک عبارت در کل دیتابیس
می توانید این کد را بصورت یک Stored Procedure تعریف کنید و در زمان های مورد نیاز از آن استفاده کنید. این دستور مکان دقیق عبارت مورد نظر شما را در ۲ ستون بصورت جدول و ستون نمایش می دهد.
کافی است کلمه مورد نظر را در @SearchStr و بجای wordSearch قرار دهید. با اجرای این قطعه کد نتیجه را مشاهده خواهید نمود.
دقت داشته باشید زمان بررسی بستگی مقدار اطلاعات داخل دیتابیس و تعداد جداول آن دارد. خیلی از مواقع این قطعه کد سرعت شما را در پیدا کردن یک کلمه در کل دیتابیس بسیار آسان می کند.
DECLARE @SearchStr nvarchar(100)
SET @SearchStr = 'wordSearch'
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', 'int', 'decimal')
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
DROP TABLE #Results


