2017-10-06 81 views
0

是否可以在Microsoft SQL Server管理器中搜索記錄?在Microsoft SQL Server中搜索記錄

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

+0

按下CTRL + T並運行您的查詢。結果會以文本形式輸出,那麼你可以搜索 – FLICKER

+0

你能澄清一下這個問題嗎?您想要搜索查詢返回的結果或搜索所有數據庫中的某些數據?或者你想在表格/視圖/等搜索。定義? –

回答

0

沒有辦法在SQL Server管理工作室中搜索對象。有可用於搜索對象的視圖和表格,如:

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

要搜索表格。

如果您的意思是,在表格內搜索數據,我需要學習T-SQL。

0

有非免費的第三方工具(例如Redgate的SQL Search),但我使用下面的proc。你必須在每一個[主]數據庫中創建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 
+0

Redgate SQL Search *是免費的(而且非常有用),實際上,我認爲它是Redgate唯一的免費工具:-)。無論如何,我認爲OP會詢問如何在數據庫的任何字段中搜索數據。 –