【问题标题】:Search All tables in database where a string matches and get table structure搜索数据库中字符串匹配的所有表并获取表结构
【发布时间】:2020-05-26 08:58:05
【问题描述】:

我有一个字符串,我想在tables 的所有Database 中搜索该字符串。

幸运的是,我有 Query 可以在数据库的所有表中搜索并得到令人印象深刻的结果。

USE DATABASE_NAME
DECLARE @SearchStr nvarchar(100) = 'SEARCH_TEXT'
DECLARE @Results TABLE (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', 'int', 'decimal')
                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

我得到了结果

*问题:*我想要第三列有这个结果,那就是primary_key列

基本上我必须对这个结果运行更新任务,所以我希望primary key 我的where 子句适用。

所以请更新这个查询并帮助我得到这个结果的第三列(primary_key 列)

PS:如果有人对此问题有其他解决方案,欢迎

简单来说基本问题是:

在数据库表中搜索特定字符串并更新特定字符串匹配的列值的值。

【问题讨论】:

  • 你们在哪里找到这个古老的密码?它与两小时前this question 中的代码几乎相同。
  • 是的代码可能相同,但我想用这个解决的问题不同
  • 我删除了 Oracle PL/SQL 的标签,因为这显然是 SQL Server 的 T-SQL
  • 您可以尝试使用DataGrip来解决这个任务:jetbrains.com/help/datagrip/full-text-search-for-databases.html
  • @ScrappyCoco 我必须为数据库写一个玉米作业

标签: sql-server tsql


【解决方案1】:

我还想获取 primaryKey 列,以便可以运行以下查询

UPDATE <TABLE_NAME> SET <COLUMN_NAME> = REPLACE(<COLUMN_NAME>, '<REPLACE_STRING>', '') where <PRIMARY_KEY_COLUMN_NAME> = PRIMARY_KEY;

所以@Tarun Query 帮我搞定 * TABLE_NAME * COLUMN_NAME * 首要的关键 但是我需要更多数据PRIMARY_KEY_COLUMN_NAME所以我更新了一点

DECLARE @SearchStr nvarchar(100) = '%JAMES%'
DECLARE @Results TABLE (ColumnName nvarchar(370), ColumnValue nvarchar(3630), PrimaryKeyId nvarchar(370), PrimaryColumnName nvarchar(370))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @PrimaryKeyId nvarchar(128),@PrimaryColumnName 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
    )
    IF @TableName IS NOT NULL
    BEGIN
        SET @PrimaryColumnName = (
                SELECT  MIN(QUOTENAME(cd.TABLE_SCHEMA) + '.' + QUOTENAME(cd.TABLE_NAME) + '.' + QUOTENAME(cd.COLUMN_NAME))
                from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cd
        join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON tc.CONSTRAINT_NAME = cd.CONSTRAINT_NAME
                WHERE
                QUOTENAME(cd.TABLE_SCHEMA) + '.' + QUOTENAME(cd.TABLE_NAME) = @TableName
                AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
            )
    END
    BEGIN
        SET @PrimaryKeyId = (
                SELECT  MIN(QUOTENAME(cd.TABLE_SCHEMA) + '.' + QUOTENAME(cd.TABLE_NAME) + '.' + QUOTENAME(cd.COLUMN_NAME))
                from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cd
        join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON tc.CONSTRAINT_NAME = cd.CONSTRAINT_NAME
                WHERE
                QUOTENAME(cd.TABLE_SCHEMA) + '.' + QUOTENAME(cd.TABLE_NAME) = @TableName

                AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
            )
    END
    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', 'int', 'decimal')
                AND    QUOTENAME(COLUMN_NAME) > @ColumnName
        )
        IF @ColumnName IS NOT NULL
        BEGIN
            IF @PrimaryKeyId IS NOT NULL
            BEGIN
                INSERT INTO @Results
                EXEC
                (
                    'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630), LEFT(' + @PrimaryKeyId + ', 3630), ''' + @PrimaryColumnName +'''
                    FROM ' + @TableName + ' (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                )
            END
            ELSE
            BEGIN
                INSERT INTO @Results
                EXEC
                (
                    'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630), NULL, ''' + @PrimaryColumnName +'''   
                    FROM ' + @TableName + ' (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                )
            END
        END
    END    
END
SELECT * FROM @Results

而这个能得到

ColumnName | ColumnValue | PrimaryKeyId | PrimaryColumnName

【讨论】:

    【解决方案2】:

    试试这个:)

    USE springhibernate
    DECLARE @SearchStr nvarchar(100) = 'James'
    DECLARE @Results TABLE (ColumnName nvarchar(370), ColumnValue nvarchar(3630), PrimaryColumnName nvarchar(370))
    SET NOCOUNT ON
    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @PrimaryColumnName 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
        )
        IF @TableName IS NOT NULL
        BEGIN
            SET @PrimaryColumnName = (
                    SELECT  MIN(QUOTENAME(cd.TABLE_SCHEMA) + '.' + QUOTENAME(cd.TABLE_NAME) + '.' + QUOTENAME(cd.COLUMN_NAME))
                    from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cd
            join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON tc.CONSTRAINT_NAME = cd.CONSTRAINT_NAME
                    WHERE
                    QUOTENAME(cd.TABLE_SCHEMA) + '.' + QUOTENAME(cd.TABLE_NAME) = @TableName
    
                    AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
                )
        END
        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', 'int', 'decimal')
                    AND    QUOTENAME(COLUMN_NAME) > @ColumnName
            )
            IF @ColumnName IS NOT NULL
            BEGIN
                IF @PrimaryColumnName IS NOT NULL
                BEGIN
                    INSERT INTO @Results
                    EXEC
                    (
                        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630), LEFT(' + @PrimaryColumnName + ', 3630)
                        FROM ' + @TableName + ' (NOLOCK) ' +
                        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                    )
                END
                ELSE
                BEGIN
                    INSERT INTO @Results
                    EXEC
                    (
                        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630), NULL   
                        FROM ' + @TableName + ' (NOLOCK) ' +
                        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                    )
                END
            END
        END    
    END
    SELECT * FROM @Results
    

    【讨论】:

    • 谢谢你,你和我一样多的时间。
    • 欢迎,随时为 SQL 提供帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2021-05-15
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多