首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

實用預存程序:搜尋全資料庫所有字串欄位精確符合指定值

     編輯:關於SqlServer

應用場景

接手舊系統時,資料庫缺乏文件,需快速找出某個值(如員工姓名 'forgot2000')分佈在哪些資料表、哪些欄位。手動逐表查詢不切實際,故撰寫通用預存程序自動掃描所有使用者資料表的字元型欄位(char/varchar/nchar/nvarchar)。

預存程序完整碼

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'searchname' AND type = 'P')
    DROP PROCEDURE searchname
GO

CREATE PROCEDURE searchname @sname VARCHAR(10)
AS
BEGIN
    -- 暫存表收集結果
    CREATE TABLE #TableList (
        tablename CHAR(200),
        colname   CHAR(200)
    )

    DECLARE @table VARCHAR(200), @col VARCHAR(200)
    SET NOCOUNT ON

    -- 游標 1:走訪所有使用者資料表
    DECLARE curTab CURSOR FOR
        SELECT name FROM sysobjects WHERE xtype = 'U'
    OPEN curTab
    FETCH NEXT FROM curTab INTO @table

    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- 游標 2:走訪該表所有字元型欄位
        DECLARE curCol CURSOR FOR
            SELECT name FROM syscolumns
            WHERE (xtype = 175 OR xtype = 167)  -- varchar / char
              AND id = (SELECT id FROM sysobjects WHERE name = @table)
        OPEN curCol
        FETCH NEXT FROM curCol INTO @col

        WHILE @@FETCH_STATUS = 0
        BEGIN
            -- 動態 SQL:精確比對該欄位是否等於 @sname
            EXEC('INSERT INTO #TableList SELECT ''' + @table + ''', ''' + @col + '''
                  FROM ' + @table + ' WHERE ' + @col + ' = ''' + @sname + '''')
            FETCH NEXT FROM curCol INTO @col
        END

        CLOSE curCol
        DEALLOCATE curCol
        FETCH NEXT FROM curTab INTO @table
    END

    CLOSE curTab
    DEALLOCATE curTab
    SET NOCOUNT OFF

    SELECT DISTINCT * FROM #TableList
    DROP TABLE #TableList
END
GO

使用方式

EXEC searchname 'forgot2000'

回傳欄位:tablename、colname,列出所有完全符合該字串的表/欄組合。執行速度視資料庫大小而定。

適用版本

SQL Server 7.0 / 2000 測試通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved