Avatar billede hojgaard Nybegynder
31. januar 2004 - 10:32 Der er 4 kommentarer og
1 løsning

Findes der ikke en stored procedure

Hej eksperter,

Findes der ikke en stored procedure, der kan søge en hel database igennem for en bestemt værdi??

SP'en skulle gerne kunne søge alle rækker og kolonner i alle tabeller.

Findes sådan en SP?
Avatar billede trer Nybegynder
31. januar 2004 - 10:36 #1
Nej.

Men den er faktisk ikke så svær at lave med dynamisk SQL. Du skal læse tabeller og kolonner (inkl. datatyper) fra SYSTEM_INFORMATION.COLUMNS - så opbygger du en dynamisk query der tester for den ønskede værdi i hver enkelt tabel.

Eneste er, at det ikke vil være specielt hurtigt.
Avatar billede hojgaard Nybegynder
31. januar 2004 - 10:44 #2
Hastig er ikke det vigtigste. Jeg har bare brug for på en let måde at få styr på en stor database.

Du kunne vel ikke guide mig lidt mere på den rigtige vej med evt. et link eller to?
Avatar billede trer Nybegynder
31. januar 2004 - 11:33 #3
Faktisk ikke - det er ikke et normalt behov i en relationel database. Meningen med den er jo at data kun giver mening i sammenhæng med andre data - og man ved hvor data af en given type er lagret.

Jeg har dog lige skrevet en procedure - den looper alt i basen gennem og undersøger om der er matchende data i nogen tabel. Bemærk at du får separate recordset ud per tabel - ikke et samlet.

create procedure dbo.SearchDatabase (@value varchar(50))
as
begin
-- lidt variabler til senere brug
declare @oldtable sysname, @table sysname, @column sysname
declare @sql varchar(888), @cols varchar(888)

-- cursor til columns-informationer
declare crsr cursor local fast_forward for
  select '['+table_schema+'].['+table_name+']', '['+column_name+']'
  from INFORMATION_SCHEMA.COLUMNS

-- åbn den, og hent første række
open crsr
fetch next from crsr
into @table, @column

-- Initier variabler
set @oldtable = @table
set @cols = ''

-- Loop gennem fundne data
while @@fetch_status=0 begin

  -- Hvis vi er færdige med at opbygge en kolonneliste, så udtræk matchende rækker
  if @oldtable<>@table begin
    if len(@cols)>2 begin
      set @sql = 'SELECT * FROM '+@oldtable+' WHERE '+right(@cols,len(@cols)-2)
      print @sql
      exec (@sql)
    end
    set @cols=''
    set @oldtable = @table
  end else begin
    --opbyg kolonneliste, lav alt om til varchar
    set @cols=@cols+'OR CAST ('+@column+' AS VARCHAR) LIKE ''%'+@value+'%'' '
  end
  -- Næste række
  fetch next from crsr
  into @table, @column
end
close crsr
deallocate crsr
end
go
Avatar billede hojgaard Nybegynder
31. januar 2004 - 11:58 #4
Kanon... 1000 tak for hjælpen trer!!!

Du har lige redet min dag, så jeg synes du har fortjent 200 point for et kanon stykke arbejde ;o)
Avatar billede trer Nybegynder
31. januar 2004 - 15:50 #5
Tak for points - og god arbejdslyst :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester