2010-12-28 3 views
1

Hy dort!Wie arbeite ich mit einer durch Kommas getrennten Zeichenfolge in SQL Server

Wir haben also eine Art Array in unserer Domäne.

zB [ 123, 234, 345 ]

Wenn wir dies gegen SQL Server werden abgefragt, verwandeln wir in der Regel dieses Array zu 123,234,345 (string), so dass wir so etwas wie (mit String ersetzen) tun können:

SELECT * 
FROM  [dbo].[myTable] 
WHERE  [myColumn] IN (123,234,345) 

Dies ist ziemlich einfach, auch wenn ein WHERE [myColumn] = 123 OR ... wäre besser, wenn es um die Leistung geht.

Dies (die Art der Transformation) ist die einzige Möglichkeit, das Array von der Domäne in die Datenbank zu bekommen.

Jetzt brauche ich, um eine Verbindung zu machen, dieses Array in eine Tabelle umgewandelt werden. Das erste, was mir in den Sinn kam, war, dass ich ein XML innerhalb der Domain erstellen und dieses irgendwie transformieren konnte. Können Sie mir Beispiele dafür geben, wie Sie dies tun oder noch bessere Lösungen?

Antwort

2

Ich bin sicher, dass Sie Komma separate Zeichenfolge und als parse into table verwenden können.

<query id="59bd6806-d28c-451a-8473-69f1432e46b2"> 
    <ids> 
    <id>1</id> 
    </ids> 
</query> 

Und als Parsen in der Tabelle:

CREATE FUNCTION [dbo].[GetQueryIdsTable] 
( 
    @query xml 
) 
RETURNS @ids TABLE (id INT, ItemOrder INT) 
AS 
BEGIN 

    INSERT INTO @ids (ID, ItemOrder) SELECT Ids.Id.value('.','int'), ROW_NUMBER() OVER(ORDER BY ROWCOUNT_BIG()) AS ItemOrder 

    FROM @query.nodes('/query/ids/id') as Ids(Id) 

    RETURN 
END 

Nach Parsen können Sie beitreten

Aber ich schlage vor, xml mit ids wie diese gesendet.

Auf der Serverseite verwende ich XML-Builder wie folgt aus:

public class Query 
{ 
    private List<string> Ids = new List<string>(); 

    public void AddId(Int32 id) 
    { 
     if (Ids.Contains(id.ToString())) 
      return; 

     Ids.Add(id.ToString()); 
    } 

    public String ToXmlString() 
     { 
     var idsElement = new XElement("ids"); 

     foreach (var id in Ids) 
     { 
      idsElement.Add(new XElement("id", id)); 
     } 


     XElement query = new XElement("query", 
       new XAttribute("id", Guid.NewGuid().ToString()), 
      idsElement 
     ); 

     return query.ToString(); 
     } 

} 

I xml mögen, weil Sie können, was Sie und einfach Parse auf SQL Server wollen.

+0

:) Ihr Link brachte mich zum Lachen ... deshalb habe ich die Loop-Variante in meiner Frage weggelassen;) ... ja - die Server-Seite wurde verpasst, aber das enthüllt die Magie! VIELEN DANK! –

+0

Sie sind willkommen. –

+0

Ich bin verwirrt, wie die ROW_NUMBER ORDER BY funktioniert: -/ –