【问题标题】:loop throgh all the data to search particular string [duplicate]遍历所有数据以搜索特定字符串[重复]
【发布时间】:2017-12-04 17:09:48
【问题描述】:

我想遍历数据库中所有可用表的所有列,以检查哪一列包含字符串“Kroki Homes”。

我有大约。我的数据库中有 56 个表。所以很难检查这 56 个表的所有列。有没有什么简单的方法可以在 sql server 中实现这一点?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以创建一个过程并可以传递字符串进行搜索。我找到了一些可能对你有帮助的地方。

    CREATE PROC [dbo].[SearchDataFromAllTables] (@SearchStr NVARCHAR(100))
    AS
    BEGIN
    
        SET NOCOUNT ON;
    
        CREATE TABLE #Results 
        (
            ColumnName NVARCHAR(370),
            ColumnValue NVARCHAR(3630)
        )
    
        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
    

    【讨论】:

    • 谢谢。它会在 56 个表的所有列中搜索吗?
    • 是的。它会:) 你可以试试。 ;)
    【解决方案2】:

    您需要编写一个存储过程来扫描所有表。

    下面的脚本给出了表格和列。从这里你应该创建一个运行中的 SQL 并动态执行以从表中选择。如果您需要更多详细信息,请告诉我们。

    SELECT tb.name AS table_name,
           c.name AS column_name, 
           c.column_id, 
           tp.name AS column_data_type, 
           c.max_length,
           c.precision,
           c.scale,
           CASE c.is_nullable WHEN 1 THEN 'YES' ELSE 'NO' END AS is_nullable
      FROM sys.tables tb,
           sys.columns c, 
           sys.types   tp
      WHERE tb.object_id = c.object_id
        AND SCHEMA_NAME(tb.schema_id) = 'dbo'
        AND c.user_type_id = tp.user_type_id
      ORDER BY table_name, column_id;
    

    【讨论】:

    • 谢谢拉梅什。在上面的答案中,我看到使用了 informational_schema.tables,在您的答案中,我看到了 sys.tables。这两者有什么区别吗?
    • 信息架构不完整,并不总是可靠的 -The case against INFORMATION_SCHEMA views,但它更便于移植,因为它符合 ANSI 标准。这真的取决于你认为什么是两害相权取其轻。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2016-01-09
    • 2011-05-26
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多