Hogyan keressünk meg egy adott értéket egy adatbázisban?

Sokszor találkozom olyan adatbázisokkal, amikor semmilyen vagy nagyon rossz dokumentáció áll rendelkezésre. Ettől többször fordul elő, hogy az alkalmazás által használt értékek adatbázisból jönnek, de még a Profiler sem biztos, hogy jó megoldás annak megfejtésére, hogy honnan is jön az adat, ráadásul sokszor időrabló feladat megtalálni egy-egy értéket. Sikerül mindig belenyúlni a jóba :)

Ma pl egy GUID-ot kellett megkeresnem egy nem dokumentált adatbázisban, és csak annyi volt a feladat, hogy egy adott GUID, melyik táblában, mely oszlopában van benne. Lehet nem a legoptimálisabb megoldás, de egy 30 GB adatbázison ahol 200+ tábla van elég gyors volt. Persze ezen azért az is segített, hogy indexelt oszlopokról volt szó...

 1DECLARE @SCHEMA sysname;
 2DECLARE @TABLE  sysname;
 3DECLARE @COLUMN sysname;
 4DECLARE @STMT   nvarchar(max);
 5 
 6DECLARE @searchtype sysname
 7SET @searchtype = 'uniqueidentifier';
 8DECLARE @searchstring nvarchar(max)
 9SET @searchstring = '5AAB6B0E-26C9-4CC2-8716-0002DEF859AA'
10 
11DECLARE SEARCH CURSOR FOR
12SELECT
13    SCHEMA_NAME(O.[schema_id]),
14    O.[name],
15    C.[name]
16FROM
17    sys.objects O
18JOIN
19    sys.columns C ON O.[object_id] = C.[object_id]
20JOIN
21    sys.types T ON C.[system_type_id] = T.[system_type_id]
22WHERE
23    O.[type] = 'U'
24AND
25    T.[name] = @searchtype
26OPEN SEARCH;
27FETCH NEXT FROM SEARCH INTO @SCHEMA, @TABLE, @COLUMN;
28WHILE @@FETCH_STATUS = 0
29    BEGIN
30     
31        SET @STMT = N'IF EXISTS (SELECT 1 FROM [' + @SCHEMA + '].[' + @TABLE + ']
32                        WHERE [' + @COLUMN + '] = CAST(''' + @searchstring + ''' AS ' + @searchtype + ' ))
33                        BEGIN
34                            SELECT ''[' + @SCHEMA + '].[' + @TABLE + '].[' + @COLUMN + ']''
35                        END';
36        EXEC(@STMT);
37        FETCH NEXT FROM SEARCH INTO @SCHEMA, @TABLE, @COLUMN;
38    END
39CLOSE SEARCH;
40DEALLOCATE SEARCH;