Как написать сценарий SQL для поиска строк в любых таблицах базы данных SQL Server, имеющих строковый столбец, значение которого равно ключевому слову? - PullRequest
2 голосов
/ 23 декабря 2010

Среда: Windows, SQL Server 2008

Например, в моей базе данных есть Таблица1, Таблица2, Таблица3 ... ТаблицаN, в каждой таблице есть Столбец1, Столбец2, Столбец3 ... СтолбецN.Проще говоря, все они являются строковым столбцом.

Я хочу найти строки, независимо от того, из какой таблицы, у которых значение столбца равно «Ключ», независимо от того, какой столбец.

Как написатьскрипт для этого?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 23 декабря 2010

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

1 голос
/ 07 января 2012
CREATE PROC SearchAllTables
(
    @SearchStr nvarchar(100)
)
AS
BEGIN

DECLARE @SearchStr nvarchar(100)
SET @SearchStr = 'Wound'

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

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
    SET @ColumnName = ''
    SET @TableName = 
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM    INFORMATION_SCHEMA.TABLES
        WHERE       TABLE_TYPE = 'BASE TABLE'
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )

    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 
END

SELECT ColumnName, ColumnValue FROM #Results
END
0 голосов
/ 23 декабря 2010

попробуйте, но это будет работать только на аналогичной структурированной таблице

DECLARE @Table nvarchar(100), @Column nvarchar(100)
DECLARE @SQLStringBuilder nvarchar(MAX) = ''
DECLARE MY_CURSOR Cursor
FOR SELECT sysobjects.name, syscolumns.name
    FROM sysobjects 
    JOIN syscolumns ON sysobjects.id = syscolumns.id
    JOIN systypes ON syscolumns.xtype=systypes.xtype
   WHERE sysobjects.xtype='U' and  systypes.name <> 'sysname' and systypes.name = 'nvarchar' 
ORDER BY sysobjects.name,syscolumns.colid 
Open MY_CURSOR 

Fetch NEXT FROM MY_CURSOR INTO @Table, @Column
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQLStringBuilder = @SQLStringBuilder +  ' SELECT ''' + @Table + ''' as TableName, ''' + @Column +  ''' as ColumnName, * FROM ' + @Table + ' WHERE ' + @Column+ ' = ''Key'' UNION ALL'

Fetch NEXT FROM MY_CURSOR INTO @Table, @Column

END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
SET @SQLStringBuilder = SUBSTRING(@SQLStringBuilder, 0, LEN(@SQLStringBuilder)-9)
EXEC(@SQLStringBuilder)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...