在Microsoft SQL Server中搜索记录

时间:2017-10-06 21:37:09

标签: sql-server

是否可以在Microsoft SQL Server管理器中搜索记录?

我的意思是在VS按 Ctrl-F 并按字搜索?

2 个答案:

答案 0 :(得分:0)

在SQL Server管理工作室中搜索对象是无法实现的。有些视图和表可用于搜索对象,如:

SELECT * FROM sys.tables WHERE name LIKE '%...%'

搜索表格。

如果您的意思是,在表格中搜索数据,我需要学习T-SQL。

答案 1 :(得分:0)

有非免费的第三方工具(例如Redgate的SQL搜索),但我使用下面的proc。您必须在每个[master]数据库中创建proc,以便它在服务器范围内可用,但您可以传入搜索项和可选的数据库名称(否则它将搜索所有数据库中的对象定义):

USE [master]
GO
/****** Object:  StoredProcedure [dbo].[sp_FindTextOnServer]    Script Date: 10/6/2017 3:39:19 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/*-----------------------------------------------------------
    This procedure will search all or a specified database objects 
    for the supplied text and return a table with the values

    Examples:
        EXEC sp_FindTextOnServer 'Billing', 'fcsCore'
        EXEC sp_FindTextOnServer 'vJurisdiction'

-----------------------------------------------------------*/
ALTER PROCEDURE [dbo].[sp_FindTextOnServer] 
                @text VARCHAR(40),
                @searchDB VARCHAR(100) = NULL
AS 

    DECLARE @DisplayText VARCHAR(100),
            @sSql VARCHAR(1000),
            @line VARCHAR(300), 
            @char CHAR, 
            @lineNo INTEGER, 
            @counter INTEGER, 
            @AddedRecord BIT,       
            @dbObjectType VARCHAR(100),
            @dbObject VARCHAR(100),
            @ObjectBody VARCHAR(7000),
            @dbName VARCHAR(100)

    SET @DisplayText = @Text
    SET @text = '%' + @text + '%' 
    SET @AddedRecord = 0

    CREATE TABLE #SearchResults
    (
        DBName VARCHAR(100) NOT NULL,
        ObjectType VARCHAR(100) NOT NULL,
        ObjectName VARCHAR(100) NOT NULL,
        Line INT NOT NULL,
        Reference VARCHAR(7000) NOT NULL
    )

    CREATE TABLE #tempSysComments
    (
        DBName VARCHAR(100),
        DBObjectType VARCHAR(100),
        DBObject VARCHAR(100),
        TextString text
    )

    --Populate a table with the search results from all databases on the server that include the searched text
    SET @sSql = 'USE [?]
                SELECT 
                    ''?'' AS DBName,
                    LOWER(REPLACE(o.type_desc, ''_'', '' '')) + '' ('' + RTRIM(type) + '')'' AS DBObjectType, 
                    OBJECT_NAME(sm.object_id) AS DBObject, 
                    CAST(sm.definition AS VARCHAR(7000)) AS TextString
                FROM sys.sql_modules AS sm
                    JOIN sys.objects AS o 
                        ON sm.object_id = o.object_id
                WHERE CAST(sm.definition AS VARCHAR(7000)) LIKE ''' + @text + '''
                ORDER BY o.type_desc, OBJECT_NAME(sm.object_id)'

    IF (@searchDB IS NULL)
    BEGIN
        INSERT INTO #tempSysComments    
        EXEC sp_MSFOREachDB @sSql
    END
    ELSE
    BEGIN
        SET @sSql = REPLACE(@sSql, '?', @searchDB)
        INSERT INTO #tempSysComments    
        EXEC (@sSql)
    END

    DECLARE codeCursor CURSOR 
    FOR 
        SELECT DBName, DBObjectType, DBObject, TextString
        FROM #tempSysComments
        WHERE DBName IS NOT NULL

    OPEN codeCursor 
    FETCH NEXT FROM codeCursor INTO @dbName, @dbObjectType, @dbObject, @ObjectBody 

    IF @@FETCH_STATUS <> 0 
    BEGIN 
        PRINT 'Text ''' + @DisplayText + ''' was not found in objects on server ' + @@SERVERNAME
        -- Close and release code cursor. 
        CLOSE codeCursor 
        DEALLOCATE codeCursor 
        RETURN 
    END 

    -- Search each object within code cursor. 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        SET @lineNo = 0 
        SET @counter = 1 

        -- Process each line. 
        WHILE (@counter <> Len(@ObjectBody)) 
        BEGIN 
            SET @char = SUBSTRING(@ObjectBody, @counter,1) 

            -- Check for line breaks. 
            IF (@char = CHAR(13)) 
            BEGIN 
                SET @lineNo = @lineNo + 1 

                -- Check if we found the specified text. 
                IF (PATINDEX(@text, @line) <> 0)
                BEGIN 
                    SET @AddedRecord = 1
                    INSERT #SearchResults
                        SELECT @dbName, @dbObjectType, @dbObject, @lineNo,  LEFT(RTRIM(LTRIM(@line)), 7000)
                END

                SET @line = '' 
            END 

            SET @line = @line + @char 
            SET @counter = @counter + 1 

        END 

        IF (@AddedRecord = 0)
            INSERT #SearchResults
                SELECT @dbName, @dbObjectType, @dbObject, 0, SUBSTRING(@ObjectBody, 1, 7000)

        SET @AddedRecord = 0

        FETCH NEXT FROM codeCursor INTO @dbName, @dbObjectType, @dbObject, @ObjectBody 
    END 

    -- Close and release cursor. 
    CLOSE codeCursor 
    DEALLOCATE codeCursor 

    --  Return the info.
    SELECT DISTINCT DBName, ObjectType, ObjectName, Line, RTRIM(LTRIM(REPLACE(REPLACE(Reference, CHAR(9), '    '), CHAR(13)+CHAR(10), ' '))) AS Reference
    FROM #SearchResults 
    ORDER BY DBName, ObjectType, ObjectName, Line

    --  Cleanup.
    DROP TABLE #SearchResults
    DROP TABLE #tempSysComments

    RETURN