2010-11-16 50 views
3

我有一個數據庫有幾百個表sql server 2008 - 找到哪些表包含特定的文本

我需要找到所有表中的任何列中的特定字符串。

我將如何處理這個問題>?

+0

一個字:全文檢索... – 2010-11-16 18:01:55

+0

你想找到在*列名指定的字符串*或*數據*存儲在所有表中的所有列中?如果是後者,你真的沒有辦法來縮小它,如果沒有,做這些表都有着類似的結構? – 2010-11-16 18:03:36

+0

存儲在列中的數據。表格有diff結構 – 2010-11-16 18:04:32

回答

4

找到表列使用方法:

SELECT table_name=sysobjects.name, 
     column_name=syscolumns.name 
    FROM sysobjects 
    JOIN syscolumns ON sysobjects.id = syscolumns.id 
    JOIN systypes ON syscolumns.xtype=systypes.xtype 
    WHERE sysobjects.xtype='U' 
ORDER BY sysobjects.name,syscolumns.colid 

,如果你想在表中的數據使用動態SQL你可以做下面幾行內容:

Declare @Sql varChar(100) 
Declare @Temp Table (Ind INT, TableName nvarchar(100)) 

Insert Into @Temp 
Select Row_Number() Over(Order BY [Name]), [Name] 
FROM 
(
    Select [Name] 
    from sys.tables 
) AS D 

Declare @index int 
Set @index = 1 
while @index < (Select Count(*) From @Temp) 
begin 
SET @SQL = ' Select * From ' + (Select TableName From @Temp Where Ind = @index) 


exec (@SQL) 
Set @index = @index + 1 
End 
1

我只是posted to another question在我看來是什麼這個給定任務的最佳解決方案。

我的答案,甚至解決這些意見作爲從:-) marc_s(是的,我們知道全文)。

希望你孤獨的讀者喜歡它(我真的需要更多的聲望)。

2

下面是一個回答的一個副本我已經在這裏提供了一個類似的問題(Search for a string in an all the tables, rows and columns of a SQLL Server DB)

倒是建議你發現自己對這個如ApexSQL Search第三方工具(也有可能是其他人在那裏過,但我用這是因爲它是免費的)。

如果你真的想要去的SQL方式,您可以嘗試使用Sorna Kumar Muthuraj創建的存儲過程 - 複製代碼如下。就在執行此存儲過程的模式中的所有表(易於使用動態SQL)

CREATE PROCEDURE SearchTables 
@Tablenames VARCHAR(500) 
,@SearchStr NVARCHAR(60) 
,@GenerateSQLOnly Bit = 0 
AS 

/* 
Parameters and usage 

@Tablenames  -- Provide a single table name or multiple table name with comma seperated. 
        If left blank , it will check for all the tables in the database 
@SearchStr  -- Provide the search string. Use the '%' to coin the search. 
        EX : X%--- will give data staring with X 
         %X--- will give data ending with X 
         %X%--- will give data containig X 
@GenerateSQLOnly -- Provide 1 if you only want to generate the SQL statements without seraching the database. 
        By default it is 0 and it will search. 

Samples : 

1. To search data in a table 

    EXEC SearchTables @Tablenames = 'T1' 
        ,@SearchStr = '%TEST%' 

    The above sample searches in table T1 with string containing TEST. 

2. To search in a multiple table 

    EXEC SearchTables @Tablenames = 'T2' 
        ,@SearchStr = '%TEST%' 

    The above sample searches in tables T1 & T2 with string containing TEST. 

3. To search in a all table 

    EXEC SearchTables @Tablenames = '%' 
        ,@SearchStr = '%TEST%' 

    The above sample searches in all table with string containing TEST. 

4. Generate the SQL for the Select statements 

    EXEC SearchTables @Tablenames  = 'T1' 
        ,@SearchStr  = '%TEST%' 
        ,@GenerateSQLOnly = 1 

*/ 

SET NOCOUNT ON 

DECLARE @CheckTableNames Table 
( 
Tablename sysname 
) 

DECLARE @SQLTbl TABLE 
( 
Tablename  SYSNAME 
,WHEREClause VARCHAR(MAX) 
,SQLStatement VARCHAR(MAX) 
,Execstatus  BIT 
) 

DECLARE @sql VARCHAR(MAX) 
DECLARE @tmpTblname sysname 

IF LTRIM(RTRIM(@Tablenames)) IN ('' ,'%') 
BEGIN 

    INSERT INTO @CheckTableNames 
    SELECT Name 
     FROM sys.tables 
END 
ELSE 
BEGIN 

    SELECT @sql = 'SELECT ''' + REPLACE(@Tablenames,',',''' UNION SELECT ''') + '''' 

    INSERT INTO @CheckTableNames 
    EXEC(@sql) 

END 

INSERT INTO @SQLTbl 
(Tablename,WHEREClause) 
SELECT SCh.name + '.' + ST.NAME, 
     ( 
      SELECT '[' + SC.name + ']' + ' LIKE ''' + @SearchStr + ''' OR ' + CHAR(10) 
       FROM SYS.columns SC 
       JOIN SYS.types STy 
       ON STy.system_type_id = SC.system_type_id 
       AND STy.user_type_id =SC.user_type_id 
      WHERE STY.name in ('varchar','char','nvarchar','nchar') 
       AND SC.object_id = ST.object_id 
      ORDER BY SC.name 
      FOR XML PATH('') 
     ) 
    FROM SYS.tables ST 
    JOIN @CheckTableNames chktbls 
      ON chktbls.Tablename = ST.name 
    JOIN SYS.schemas SCh 
    ON ST.schema_id = SCh.schema_id 
WHERE ST.name <> 'SearchTMP' 
    GROUP BY ST.object_id, SCh.name + '.' + ST.NAME ; 

    UPDATE @SQLTbl 
    SET SQLStatement = 'SELECT * INTO SearchTMP FROM ' + Tablename + ' WHERE ' + substring(WHEREClause,1,len(WHEREClause)-5) 

    DELETE FROM @SQLTbl 
    WHERE WHEREClause IS NULL 

WHILE EXISTS (SELECT 1 FROM @SQLTbl WHERE ISNULL(Execstatus ,0) = 0) 
BEGIN 

    SELECT TOP 1 @tmpTblname = Tablename , @sql = SQLStatement 
     FROM @SQLTbl 
    WHERE ISNULL(Execstatus ,0) = 0 



    IF @GenerateSQLOnly = 0 
    BEGIN 

     IF OBJECT_ID('SearchTMP','U') IS NOT NULL 
      DROP TABLE SearchTMP 
     EXEC (@SQL) 

     IF EXISTS(SELECT 1 FROM SearchTMP) 
     BEGIN 
      SELECT [email protected],* FROM SearchTMP 
     END 

    END 
    ELSE 
    BEGIN 
     PRINT REPLICATE('-',100) 
     PRINT @tmpTblname 
     PRINT REPLICATE('-',100) 
     PRINT replace(@sql,'INTO SearchTMP','') 
    END 

    UPDATE @SQLTbl 
     SET Execstatus = 1 
     WHERE Tablename = @tmpTblname 

END 

SET NOCOUNT OFF 

go 
相關問題