2009-02-27 65 views
1

我想搜索整個MS SQL 2000數據庫中的一個值。這將僅用於幫助開發。請在考慮這個問題時記住這一點。SQL要搜索整個MS SQL 2000數據庫的值

這將讓所有的表名和我正在尋找的數據類型的列:

SELECT Columns.COLUMN_NAME, tables.TABLE_NAME 
FROM INFORMATION_SCHEMA.Columns as Columns 
JOIN INFORMATION_SCHEMA.TABLES as tables 
On Columns.TABLE_NAME = tables.TABLE_NAME 
WHERE Columns.DATA_TYPE = 'INT' 

我的想法是這樣的:

-- Vars 
DECLARE @COUNTER INT 
DECLARE @TOTAL INT 
DECLARE @TABLE CHAR(128) 
DECLARE @COLUMN CHAR(128) 
DECLARE @COLUMNTYPE CHAR(128) 
DECLARE @COLUMNVALUE INT 

-- What we are looking for 
SET @COLUMNTYPE = 'INT' 
SET @COLUMNVALUE = 3 
SET @COUNTER = 0 

-- Find out how many possible columns exist 
SELECT @TOTAL = COUNT(*) 
FROM INFORMATION_SCHEMA.Columns as Columns 
JOIN INFORMATION_SCHEMA.TABLES as tables 
On Columns.TABLE_NAME = tables.TABLE_NAME 
WHERE Columns.DATA_TYPE = @COLUMNTYPE 
PRINT CAST(@TOTAL AS CHAR) + 'possible columns' 
WHILE @COUNTER < @TOTAL 
BEGIN 
    SET @COUNTER = @COUNTER +1 
    -- ADD MAGIC HERE 
END 

任何想法?

UPDATE我最近發現這個tool工作得很好。

+0

你看看這裏:http://stackoverflow.com/questions/591853/search-for-a-string-in-an-all-the-tables-rows-and-columns-of-a -D b ? – 2009-02-27 10:25:44

回答

6

由於它只是開發(可能不必非常優雅),那麼如何使用TSQL生成一堆TSQL,然後將其複製回查詢窗口並執行?

SELECT 'SELECT * FROM [' + tables.TABLE_NAME + '] WHERE [' 
     + Columns.Column_Name + '] = ' + CONVERT(varchar(50),@COLUMNVALUE) 
FROM INFORMATION_SCHEMA.Columns as Columns 
INNER JOIN INFORMATION_SCHEMA.TABLES as tables 
    On Columns.TABLE_NAME = tables.TABLE_NAME 
WHERE Columns.DATA_TYPE = @COLUMNTYPE 

這不會是漂亮,但它應該工作...另一種可能是插入像上面爲表變量,則表變量使用EXEC (@Sql)了循環。但對於開發目的來說,它可能不值得...

0

我發現這個腳本是有用的......但正如馬克指出的那樣,這並不值得。自從六個月前我寫了這本書以來,我只用了很多次。

它確實派上用場,因爲在我們的開發環境中有幾個表在查詢它們時會導致綁定錯誤,而且我總是會忘記哪些表。

BEGIN TRAN 

declare @search nvarchar(100) 
set @search = 'string to search for' 

-- search whole database for text 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

IF nullif(object_id('tempdb..#tmpSearch'), 0) IS NOT NULL DROP TABLE #tmpSearch 
CREATE TABLE #tmpSearch (
    ListIndex int identity(1,1), 
    CustomSQL nvarchar(2000) 
) 
Print 'Getting tables...' 
INSERT #tmpSearch (CustomSQL) 
select 'IF EXISTS (select * FROM [' + TABLE_NAME + '] WHERE [' + COLUMN_NAME + '] LIKE ''%' + @search + '%'') BEGIN PRINT ''Table ' + TABLE_NAME + ', Column ' + COLUMN_NAME + ''';select * FROM [' + TABLE_NAME + '] WHERE [' + COLUMN_NAME + '] LIKE ''%' + @search + '%'' END' FROM information_schema.columns 
where DATA_TYPE IN ('ntext', 'nvarchar', 'uniqueidentifier', 'char', 'varchar', 'text') 
and TABLE_NAME NOT IN ('table_you_dont_want_to_look_in', 'and_another_one') 


Print 'Searching... 

' 
declare @index int 
declare @customsql nvarchar(2000) 
WHILE EXISTS (SELECT * FROM #tmpSearch) 
BEGIN 
    SELECT @index = min(ListIndex) FROM #tmpSearch 

    SELECT @customSQL = CustomSQL FROM #tmpSearch WHERE ListIndex = @index 

    IF @customSql IS NOT NULL 
     EXECUTE (@customSql) 

    SET NOCOUNT ON 
    DELETE #tmpSearch WHERE ListIndex = @index 
    SET NOCOUNT OFF 
END 

print 'the end.' 
ROLLBACK