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;