SMS utan tårar

Men många webbplatser använder en kombination av båda: om du till exempel hade en databas med personalinformation i den, och det också fanns pressmeddelanden på din webbplats som innehåller några av samma personals namn, vore det inte bra om du kunde fråga en fråga och få tillbaka all information som webbplatsen har om den personen? Nåväl, efter lite undersökningar har vi hittat ett sätt att göra detta, och mycket av äran bör delas med Duncan Gurney och Keith Burns från Microsoft som pekade oss i rätt riktning – tricket är att använda en heterogen koppling mellan filsystem och en databastabell.

SMS utan tårar

Vi använder Index Server och SQL Server 2000 som körs på Windows 2000-boxar för den här demon, så hur ska du gå tillväga? Först måste du sätta upp en länkad server, som i det här fallet kommer att vara en indexserver, och genom att skapa en länkad server kommer du sedan att kunna fråga den precis som om det vore en vanlig databas. Koden för att göra detta är:

[email protected] = ’mydocs’,

@srvproduct = ’Indexeringsserver’,

@provider = ’MSIDXS’,

@datasrc = ’system’

Detta kommer uppenbarligen att behöva en förklaring. Sp_addlinkedserver är en lagrad procedur inom en standardinställning av SQL Server 2000, och den kräver en serie parametrar som kännetecknas av den initiala @-symbolen. Den första av dessa, @server, är ett namn för denna länkade server och kan vara vilket namn som helst som du kommer att använda i senare frågor. Den andra parametern, @srvproduct, anger att det är en indexserver du vill länka till, eftersom denna procedur skulle kunna användas för att länka till alla typer av datakällor. Alla länkade servrar är anslutna med en leverantör som tillhandahåller ”limmet” för att gränssnittet till dess datalager, och i fallet med Index Server kallas denna leverantör ’MSIDXS’. Den sista parametern är @datasrc, som, i fallet med Index Server, är namnet på katalogen som kommer att frågas, ”system” är standard.

För att se om den här koden fungerar korrekt på din installation, utfärda kommandot sp_helpserver, som returnerar en lista över de länkade servrarna, och om du ser en server som heter ’mydocs’ är allt bra. Du måste nu lägga till en inloggning för denna datakälla, och du gör det igen med en lagrad procedur:

sp_addlinkedsrvlogin ’mydocs’, true, ’user’, ’password’

Parametrarna för denna procedur är uppenbara: den första är namnet på den länkade servern som du definierade i den tidigare lagrade proceduren, och de två sista är databasens användarnamn och lösenord – den ”sanna” är där för att se till att referenserna skickas igenom till den länkade servern. Nu måste du testa att du kan fråga indexservern, så prova detta:

välj * från mydocs…[“c:dump”]

’c:dump’ beror på vilka mappar och enheter du indexerar med Index Server. Om allt är bra bör du få tillbaka en serie poster, var och en representerar en fil som har indexerats. Om du inte får några poster, kontrollera att din Index Server faktiskt har indexerat något. Du kan köra en enkel fråga inifrån MMC mot indexservern för att testa den. Om allt är bra kan du nu prova några andra frågor som:

välj filnamn, storlek från mydocs…[“c:dump”]

där storlek > 2000000

Det här är mycket bra, men vad du behöver göra är att fråga efter det faktiska innehållet i filerna och inte bara deras attribut, så något lite mer komplext krävs:

välj * från openquery(mydocs,’välj katalog,filnamn,storlek,karakterisering,

skapa från scope(””c:dump””) där innehåller (innehåll, ”Jones”)’)

Den knepiga biten är ’openquery’, som exekverar den specificerade passthrough-frågan på den givna länkade servern – detta kombineras med funktionen ’scope’ för att tillåta uppsättningar av filer att behandlas som en virtuell tabell. ’where’-satsen tittar på det indexerade innehållet i filerna efter ordet ’Jones’.

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *