2016-07-31 3 views
0

Ich habe eine SQL Server 2008 R2-Datentabelle dbo.Forum_Posts mit Spalten Subject (nvarchar(255)) und Body (nvarchar(max)).Welcher ist der schnellste Weg, um Wörter aus T-SQL-Datentypen zu erhalten?

Ich möchte alle Worte mit einer Länge von 3 aus Spalten> = Subject und Body und in dbo.SearchItem (column Title (nvarchar(200)) Datentabelle dbo.Search_Word (column Word, nvarchar(100)) und Datentabelle einfügen bekommen.

Ich möchte auch neu generierte SearchWordsID (primary key, autoincrement, int) von dbo.Search_Word bekommen, und SearchItemID (primary key, autoincrement,int) von dbo.SearchItem, und fügen Sie sie in Datentabelle dbo.SearchItemWord (columns SearchWordsID (foreign key,int, not null) und SearchItemID (foreign key,int,not null).

Was ist der schnellste Weg, dies in T-SQL zu tun? Oder muss ich C# verwenden? Vielen Dank im Voraus für jede Hilfe.

+1

Während Sie T-SQL verwenden könnte, rufen Sie sie auf dem relationalen Mengenlehre funktioniert. Warum nicht die Daten per T-SQL abrufen und Wörter mit C# parsen? C#, das auf C++ und anderen Sprachen aufbaut, ist eine kursive Sprache, daher sollte die Leistung schneller implementiert werden. Wenn Sie jedoch SQL verwenden möchten, stellen Sie sicher, dass Volltext aktiviert ist. Alternativ können Sie [FREETEXT - MSDN] (https://msdn.microsoft.com/en-us/library/ms176078.aspx) –

+0

Vielen Dank für Ihren Rat. Leider sollte ich T-SQL als Lösung verwenden. – alenan2013

+0

Letzter Kommentar: Damit Sie wissen, spreche ich über eine nützliche, konsistente, genaue Liste. Ist das handtypisch, hoffe ich, dass Sie es nicht für etwas Wichtiges verwenden. Fehler werden wahrscheinlich bestehen. –

Antwort

1

Wie gewünscht, hilft dies die ID des halten. Sie erhalten also eine DISTINCT-Liste von Werken mit ID.

etwas anderen Ansatz als die erste Antwort, aber leicht über den Äußeren erreicht Nehmen

**

Sie müssen die erste Abfrage Wählen Sie bearbeiten KeyID = [YourKeyID], Wörter = [YourField1] +‘‚+ [YourField2] von [Yourtable]

**

Declare @String varchar(max) = '' 
Declare @Delimeter varchar(25) = ' ' 

-- Generate and Strip special characters 
Declare @StripChar table (Chr varchar(10));Insert Into @StripChar values ('.'),(','),('/'),('('),(')'),(':') -- Add/Remove as needed 

-- Generate Base Data and Expand via Outer Apply 
Declare @XML xml 
Set @XML = (
      Select A.KeyID 
        ,B.Word 
      From (Select KeyID=[YourKeyID],Words=[YourField1]+' '+[YourField2] from [YourTable]) A 
      Outer Apply (
          Select Word=split.a.value('.', 'varchar(150)') 
          From (Select Cast ('<x>' + Replace(A.Words, @Delimeter, '</x><x>')+ '</x>' AS XML) AS Data) AS A 
          Cross Apply data.nodes ('/x') AS Split(a) 
      ) B 
For XML RAW) 

-- Convert XML to varchar(max) for Global Search & Replace (could be promoted to Outer Appy) 
Select @String = Replace(Replace(cast(@XML as varchar(max)),Chr,' '),' ',' ') From @StripChar 
Select @XML = cast(@String as XML) 

Select Distinct 
     KeyID = t.col.value('@KeyID', 'int') 
     ,Word = t.col.value('@Word', 'varchar(150)') 
From @XML.nodes('/row') AS t (col) 
Where Len(t.col.value('@Word', 'varchar(150)'))>3 
Order By 1 

Returns

KetID Word 
0  UNDEF 
0  Undefined 
1  HIER 
1  System 
2  Control 
2  UNDEF 
3  JOBCONTROL 
3  Market 
3  Performance 
... 
87  Analyitics 
87  Market 
87  UNDEF 
88  Branches 
88  FDIC 
88  UNDEF 
... 
+0

@ alenan2013 Aktualisiert, so dass Sie nur die INITIAL Abfrage bearbeiten müssen –

+0

@ alenan2013 Ich sollte auch hinzufügen Leistung wird im Vergleich zu den ersten Anwer –

+0

Vielen Dank noch einmal, es funktioniert super :) Ich mache mir nur sorgen Was könnte passieren, wenn @XML größer als varchar (max) wäre? – alenan2013

0

Sie benötigen T-SQL, um das Einfügen in Ihre Tabellen durchzuführen. Ihre größte Herausforderung wird sein, die Beiträge in Worte zu teilen.

Mein Vorschlag wäre, die Beiträge in C# zu lesen, jeden Beitrag in Wörter zu teilen (Sie können die Split Methode auf Leerzeichen oder Satzzeichen aufteilen), die Sammlung von Wörtern filtern und dann Ihre Einsätze von C# ausführen.

Sie können vermeiden, T-SQL direkt zu verwenden, wenn Sie Entity Framework oder ein ähnliches ORM verwenden.

Versuchen Sie nicht, T-SQL zu verwenden, um Ihre Posts in Wörter aufzuteilen, es sei denn, Sie möchten wirklich eine vollständige SQL-Lösung und sind bereit, sich Zeit zu nehmen, um sie zu perfektionieren. Und, ja, es wird langsam: T-SQL ist nicht schnell bei String-Operationen.

Sie können auch die Volltextindizierung untersuchen, von der ich glaube, dass sie Suchworte unterstützt.

+0

Vielen Dank für Ihre Hilfe und Aufmerksamkeit. Aber, wie ich oben erwähnt habe, sollte ich T-SQL als Lösung verwenden (dies ist die angeforderte Lösung). – alenan2013

+0

@ alenan2013 Ich habe das: Ist dies die richtige Lösung angesichts der Einschränkungen Ihrer Abteilung? Können oder wollen Sie das mit einer effektiveren Methode lösen? Sie müssen nicht nur mit FULL TEXT analysieren (wenn Sie sich für die Optimierung interessieren), sondern müssen möglicherweise eine benutzerdefinierte Bibliothek, einen Thesaurus erstellen und selbst dann zumindest einen Basisalgorithmus implementieren, um Varianzen und Rechtschreibfehler in den Zeilen zu behandeln. Siehe SOUNDEX, ähnliche Methoden. Haben Sie eine Fehlertoleranz für Genauigkeit/Fehlalarme? Sind mehrere Sprachen beteiligt? Diese und mehr sollten gefragt werden und C#/andere OOP-Sprachen sollten berücksichtigt werden ... –

+0

@ alenan2013 es sei denn, Sie möchten einfach eine Liste, die einen begrenzten Zweck erfüllt, dies kann schwierig sein, auch mit den richtigen STOP WORDS. Nicht unmöglich, aber hoffentlich können Sie sehen, wie mindestens das ursprüngliche Design der Liste von Wörtern in einer anderen Sprache getan werden sollte oder sich auf eine Menge ... von finesse Code schreiben vorbereiten ... selbst wenn Sie jedes Wort in seine setzen eigene Reihe und lief eine eindeutige/Gruppe von, wenn Sie sich für eine nützliche Liste interessieren, müssen Algorithmen entwickelt werden ... BTW, haben Sie Tag C# –

0

Vielleicht wird dies

Declare @String varchar(max) = '' 
Declare @Delimeter varchar(25) = ' ' 

Select @String = @String + ' '+Words 
    From (
     Select Words=[YourField1]+' '+[YourField2] from [YourTable] 
     ) A 

-- Generate and Strip special characters 
Declare @StripChar table (Chr varchar(10));Insert Into @StripChar values ('.'),(','),('/'),('('),(')'),(':') -- Add/Remove as needed 
Select @String = Replace(Replace(@String,Chr,' '),' ',' ') From @StripChar 

-- Convert String into XML and Split Delimited String 
Declare @Table Table (RowNr int Identity(1,1), String varchar(100)) 
Declare @XML xml = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) 
Insert Into @Table Select String.value('.', 'varchar(max)') From @XML.nodes('x') as T(String) 

-- Generate Final Resuls 
Select Distinct String 
From @Table 
Where Len(String)>3 
Order By 1 

Returns (Probe)

String 
    ------------------ 
    Access 
    Active 
    Adminstrators 
    Alternate 
    Analyitics 
    Applications 
    Branches 
    Cappelletti 
    City 
    Class 
    Code 
    Comments 
    Contact 
    Control 
    Daily 
    Data 
    Date 
    Definition 
    Deleted 
    Down 
    Email 
    FDIC 
    Variables 
    Weekly 
+0

Vielen Dank, es funktioniert perfekt.Aber ich habe ein Problem, dass ich habe in meiner Frage nicht erwähnt: Ich sollte Forum Post Link neben jedem Wort mit der Länge> 3 speichern. Die Datentabelle mit Forum Post Links kann mit meiner Tabelle dbo.Forum_Post verbunden werden. Wären Sie so nett und aktualisieren Sie Ihre Lösung, um Forum Post Link neben jedem Wort zu speichern? Vielen Dank im Voraus für Ihre Hilfe. – alenan2013

+0

@ alenan2013 Feldname für Forum Post Links? –

+0

Der Feldname ist ForumLink in datable dbo.Forum_Forums. – alenan2013

Verwandte Themen