Искать все столбцы таблицы для значения?

Я искал ответ на этот вопрос, но все, что я могу найти, это люди, которые спрашивают, как искать все столбцы ВСЕХ таблиц в базе данных для значения. Я просто хочу искать все столбцы для конкретной таблицы. Люди, которые придумали для всех таблиц, сложны и трудно понять, где именно он ищет определенную таблицу. Может кто-нибудь мне помочь? Благодаря

Ответ 1

Просто используйте сторонний инструмент. Есть несколько, которые на 100% бесплатны, и вы не ошибетесь с любым из них, потому что они сэкономят вам массу времени.

Поиск ApexSQL (поиск и схемы, и данных), SSMS Toolpack (поиск схемы и данных, но не бесплатный для SQL Server 2012), Поиск SQL (только поиск данных).

Честно говоря, я не очень понимаю, почему даже очень опытные администраторы баз данных беспокоятся о написании сценариев для этого, если они могут бесплатно использовать какой-то инструмент, который сделает эту работу.

Ответ 2

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

Это работа для Полнотекстового поиска.

Не тратьте время на LIKE '%' + @SearchStr + '%'. Вы должны написать много сложного кода для его поддержки, и это решение не будет работать в любом случае.

Ответ 3

В подобном вопросе я упомянул SQL Workbench/J.

Команда, которая ищет базу данных, также может быть ограничена только одной таблицей. Поэтому, даже если этот вопрос был специфичен для PostgreSQL, этот инструмент работает и для SQL Server, насколько я знаю.

Ответ 4

Я изменил этот сохраненный proc, чтобы взять имя таблицы в качестве второго параметра и просто выполнить поиск этой таблицы для данных:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SearchOneTable]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[SearchOneTable]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROC [dbo].[SearchOneTable]
(
    @SearchStr nvarchar(100) = 'A',
    @TableName nvarchar(256) = 'dbo.Alerts'
)
AS
BEGIN

    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

    --SET NOCOUNT ON

    DECLARE @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
    --SET @SearchStr2 = QUOTENAME(@SearchStr, '''') --exact match
    SET @ColumnName = ' '


        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 
    SELECT ColumnName, ColumnValue FROM #Results
END


GO

Ответ 5

Вот решение, которое, подобно подходу @Decker97, вычисляет из метаданных, столбцы которых пригодны для текстового поиска. Предполагает 2005+ для использования XML PATH, а также sys.columns, sys.tables и т.д. Поддерживает TEXT/NTEXT/ CHAR/NCHAR/VARCHAR/NVARCHAR и даже помещает ведущую N в строку поиска, где это необходимо. Не поддерживает столбцы XML. То, что он делает несколько иначе, состоит в том, что он возвращает единый набор результатов для каждой таблицы, а не для каждого отдельного столбца, поэтому вы получаете только одну строку в каждой строке таблицы, даже если несколько столбцов совпадают. Если цель состоит в том, чтобы понять, как это работает, а не просто иметь решение, это, вероятно, займет немного больше, чем это... возможно, мне следует писать об этой проблеме (я, вероятно, не должен лениться и фактически создавать списки столбцов вместо просто используя SELECT *).

DECLARE @SearchTerm NVARCHAR(32) = 'foo';

DECLARE @TableName NVARCHAR(128) = NULL;

SET NOCOUNT ON;

DECLARE @s NVARCHAR(MAX) = '';

WITH [tables] AS
(
    SELECT [object_id] 
        FROM sys.tables AS t
        WHERE (name = @TableName OR @TableName IS NULL)
        AND EXISTS
        (
            SELECT 1 
                FROM sys.columns
                WHERE [object_id] = t.[object_id]
                AND system_type_id IN (35,99,167,175,231,239)
        )
)
SELECT @s = @s + 'SELECT ''' 
    + REPLACE(QUOTENAME(OBJECT_SCHEMA_NAME([object_id])),'''','''''')
    + '.' + REPLACE(QUOTENAME(OBJECT_NAME([object_id])), '''','''''')
    + ''',* FROM ' + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) + ' WHERE ' + 
    (
        SELECT QUOTENAME(name) + ' LIKE ' + CASE 
            WHEN system_type_id IN (99,231,239) 
            THEN 'N' ELSE '' END
            + '''%' + @SearchTerm + '%'' OR '
        FROM sys.columns
        WHERE [object_id] = [tables].[object_id]
        AND system_type_id IN (35,99,167,175,231,239)
        ORDER BY name
        FOR XML PATH(''), TYPE
).value('.[1]', 'nvarchar(max)') + CHAR(13) + CHAR(10)
FROM [tables];

SELECT @s = REPLACE(@s,' OR ' + CHAR(13),';' + CHAR(13));

/*
    make sure you use Results to Text and adjust Tools / Options / 
    Query Results / SQL Server / Results to Text / Maximum number
    of characters if you want a chance at trusting this output 
    (the number of tables/columns will certainly have the ability
    to exceed the output limitation)
*/

SELECT @s;
-- EXEC sp_executeSQL @s;

Ответ 6

Это похоже на то, что вы просто хотите знать, какая таблица и столбец хранятся, а не то, что вы хотите знать, что во время выполнения вашего кода, или измените его. У меня также была эта проблема, и это решило это:

Загрузите свою базу данных в формате SQL (например, с помощью phpmyadmin), откройте ее с помощью текстового редактора и найдите нужные события.

Ответ 7

Небольшой обходной путь, который требует немного меньше копирования-вставки, поскольку команду можно легко создать с помощью запросов.

Инвертируйте оператор IN в предложении WHERE как VALUE IN <fields> (в отличие от более распространенного варианта использования FIELD IN <values>).

SELECT col_1, col_2, ... , col_n 
FROM <table>
WHERE CAST(<value> AS varchar(max)) IN 
   (
   CAST(col_1 AS varchar(max)),
   CAST(col_2 AS varchar(max)),
   ...,
   CAST(col_n AS varchar(max))
   )

Поскольку varchar является довольно гибким типом данных, он становится довольно надежным (вы можете бросить ISNULL/NULLIF для изменения по мере необходимости) и, в зависимости от варианта использования, возможно, может использоваться для более чем одного поискового значения.

Более надежное решение, использующее динамическое выполнение и PL/SQL, будет состоять в том, чтобы написать процедуру для динамического построения представления целевой таблицы (с помощью чтения, например, схемы MySQL information_schema, схемы Oracle SYS и т.д.), Ограниченную где Предложение, содержащее входную строку, жестко закодированное в серию предложений "ИЛИ" -concatenated/IN для условий фильтрации.

Ответ 8

Я столкнулся с этой проблемой, как правило, после загрузки данных из файла CSV, где мне пришлось модифицировать запятые, "в текстовых полях, чтобы данные загружались правильно и один раз в SQL Server, возникает необходимость в изменении измененного символ обратно в запятую, и это полезно для поиска всей таблицы. Грег Робиду в mssqltips опубликовал хранимую процедуру, которая выполняет только это, ищет столбцы указанной таблицы для определенного значения String. Вы можете найти его вместе с SPROC, который не использует курсор и подробности здесь:

https://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in-all-columns-in-a-sql-server-table/

Я разместил исходный SPROC ниже:

USE master 
GO 

CREATE PROCEDURE dbo.sp_FindStringInTable @stringToFind VARCHAR(100), @schema sysname, @table sysname 
AS 

DECLARE @sqlCommand VARCHAR(8000) 
DECLARE @where VARCHAR(8000) 
DECLARE @columnName sysname 
DECLARE @cursor VARCHAR(8000) 

BEGIN TRY 
   SET @sqlCommand = 'SELECT * FROM [' + @schema + '].[' + @table + '] WHERE' 
   SET @where = '' 

   SET @cursor = 'DECLARE col_cursor CURSOR FOR SELECT COLUMN_NAME 
   FROM ' + DB_NAME() + '.INFORMATION_SCHEMA.COLUMNS 
   WHERE TABLE_SCHEMA = ''' + @schema + ''' 
   AND TABLE_NAME = ''' + @table + ''' 
   AND DATA_TYPE IN (''char'',''nchar'',''ntext'',''nvarchar'',''text'',''varchar'')' 

   EXEC (@cursor) 

   OPEN col_cursor    
   FETCH NEXT FROM col_cursor INTO @columnName    

   WHILE @@FETCH_STATUS = 0    
   BEGIN    
       IF @where <> '' 
           SET @where = @where + ' OR' 

       SET @where = @where + ' [' + @columnName + '] LIKE ''' + @stringToFind + '''' 
       FETCH NEXT FROM col_cursor INTO @columnName    
   END    

   CLOSE col_cursor    
   DEALLOCATE col_cursor  

   SET @sqlCommand = @sqlCommand + @where 
   PRINT @sqlCommand 
   EXEC (@sqlCommand)  
END TRY 
BEGIN CATCH 
   PRINT 'There was an error. Check to make sure object exists.'
   PRINT error_message()

   IF CURSOR_STATUS('variable', 'col_cursor') <> -3 
   BEGIN 
       CLOSE col_cursor    
       DEALLOCATE col_cursor  
   END 
END CATCH 

Ответ 9

Я нашел лучший ответ только для select * из таблицы, а затем скопируйте и вставьте в Excel и нажмите Ctrl + F