Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 循环遍历所有数据以搜索特定字符串_Sql_Sql Server - Fatal编程技术网

Sql 循环遍历所有数据以搜索特定字符串

Sql 循环遍历所有数据以搜索特定字符串,sql,sql-server,Sql,Sql Server,我想循环遍历数据库中所有可用表的所有列,以检查哪一列包含字符串“Kroki Homes” 我的数据库中大约有56个表。因此,很难将这56个表的所有列都签入。在sql server中有什么简单的方法可以实现这一点吗?您可以创建一个过程,并可以传递字符串进行搜索。我找到了一些可能对你有帮助的地方 CREATE PROC [dbo].[SearchDataFromAllTables] (@SearchStr NVARCHAR(100)) AS BEGIN SET NOCOUNT ON;

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


我的数据库中大约有56个表。因此,很难将这56个表的所有列都签入。在sql server中有什么简单的方法可以实现这一点吗?

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

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

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

下面的脚本提供给表和列。由此,您应该在运行中创建一个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;

谢谢它会在56个表的所有列中搜索吗?会。它会:)你可以试试看谢谢拉梅什。在上面的回答中,我看到使用了信息性的schema.tables,在您的回答中,我看到了sys.tables。这两者之间有什么区别吗?信息模式是不完整的,并不总是可靠的,但是它在ANSI标准中更便于移植。这真的取决于你认为什么是两个邪恶中的较小者。参考这个链接