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