Arhn - архитектура программирования

sql server 2008 - найти, какие таблицы содержат определенный текст

у меня есть база данных с несколькими сотнями таблиц

мне нужно найти конкретную строку в любом из столбцов всех таблиц.

как мне подойти к этой проблеме> ??


  • Вы хотите найти указанную строку в именах столбцов или в данных, хранящихся во всех столбцах всех таблиц? В последнем случае у вас действительно нет возможности сузить круг вопросов, а если нет, имеют ли все таблицы схожую структуру? 16.11.2010
  • данные, хранящиеся в столбцах. таблицы имеют различную структуру 16.11.2010

Ответы:


1

чтобы найти столбцы таблицы, используйте:

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
16.11.2010

2

Ниже приводится копия ответа на аналогичный вопрос, который я уже задавал здесь (Поиск строки во всех таблицах, строках и столбцах БД сервера SQLL)

Я бы посоветовал вам найти для этого сторонний инструмент, такой как 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 Tablename=@tmpTblname,* 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
16.07.2013

3

Я просто ответил на другой вопрос, что, на мой взгляд, является лучшим решением этой задачи.

Мой ответ даже касается таких комментариев, как этот от marc_s :-) (да, мы знаем о полнотексте).

Надеюсь, вам, одинокому читателю, это понравится (мне действительно нужно больше репутации).

23.09.2012
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..