SQL Server: Search all tables for a particular GUID

前端 未结 5 2166
说谎
说谎 2021-02-03 23:10

i came across the need to cleanse some data, and i need to find some particular guids (i.e. uniqueidentifiers) in SQL Server°.

i\'ve come up with a stor

5条回答
  •  你的背包
    2021-02-03 23:47

    You can wrap all into a single SELECT and search all tables at once:

    ALTER PROCEDURE dbo.FindGUID @searchValue uniqueidentifier AS
    BEGIN
    SET NOCOUNT ON;
    DECLARE @sql NVARCHAR(MAX);
    WITH cte_all_tables(SQL) AS (
        SELECT N'SELECT ''' + QUOTENAME(t.TABLE_SCHEMA) + '.' +QUOTENAME(t.TABLE_NAME) + 
            + N''' FROM ' + QUOTENAME(t.TABLE_SCHEMA) + '.' +QUOTENAME(t.TABLE_NAME)
            + N' WHERE ' +
            (
                SELECT QUOTENAME(c.COLUMN_NAME) + N'= @searchValue OR '
                FROM INFORMATION_SCHEMA.Columns c
                WHERE c.TABLE_NAME = t.TABLE_NAME
                    AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
                    AND c.DATA_TYPE = 'uniqueidentifier'
                FOR XML PATH('')
            ) + N' 0=1 ' 
       FROM INFORMATION_SCHEMA.Columns c
            INNER JOIN INFORMATION_SCHEMA.Tables t
            ON c.TABLE_NAME = t.TABLE_NAME
            AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
            AND t.TABLE_TYPE = 'BASE TABLE'
        WHERE DATA_TYPE = 'uniqueidentifier')
    SELECT @sql = (SELECT [SQL] + N' UNION ALL ' FROM cte_all_tables
    FOR XML PATH('')) + N' SELECT NULL WHERE 0=1';
    PRINT @SQL;
    exec sp_executesql @sql, N'@searchValue uniqueidentifier', @searchValue;
    END
    

    I used tombstone terminators like 'OR 0=1' and even an entire UNION, but that is just because I'm too lazy to trim the ending from the built concatenated strings.

提交回复
热议问题