2012-04-09 13 views
3

Ich habe eine String-Liste und ich muss überprüfen, ob einer der Werte in der Liste in der Datenbanktabelle enthält. Gibt den Datensatz der vorhandenen Werte zurück.Übergeben einer Liste <string> an eine gespeicherte Prozedur

public DataSet CheckDocumentNumber(List<string> DocNumber) 
{ 
    DataSet DocNum = new DataSet(); 
    SqlTransaction transaction = DALDBConnection.SqlConnection.BeginTransaction(); 

    try 
    { 
     string[] taleNames = new string[1]; 
     taleNames[0] = "DocNum"; 
     SqlParameter[] param = new SqlParameter[1]; 
     param[0] = new SqlParameter("@DocNumber", DocNumber); 

     SqlHelper.FillDataset(transaction, CommandType.StoredProcedure, "spCheckDocNumber", DocNum, taleNames, param); 
     transaction.Commit(); 
    } 
    catch (Exception e) 
    { 
     transaction.Rollback(); 
    } 

    return DocNum; 
} 

Meine gespeicherte Prozedur ist

CREATE PROCEDURE spCheckDocNumber 
    @DocNumber VARCHAR(MAX) 
AS 
BEGIN 
    SELECT * FROM tblDocumentHeader WHERE DocumentNumber = @DocNumber 
END 

Ich muss wissen, dass, wie muss ich die Liste der gespeicherten Prozedur übergeben und wie die Liste zu überprüfen, mit in dem Verfahren. plz Hilfe

+0

Wie viele Datensätze erwarten Sie die String-Variable haben kann? – Pankaj

+0

Haben Sie die Kontrolle über die gespeicherte Prozedur, d. H., Dürfen Sie sie ändern? Sie müssten Ihre gespeicherte Prozedur ändern, um entweder Tabellenwerte zu verwenden (http://mindlesspassenger.wordpress.com/2011/05/09/table-valued-parameters-codefirst-and-stored-procedures-3/), XML, oder schließen Sie die Liste in die Abfrage mit dynamic sql ein. Oder Sie müssen die gespeicherte Prozedur einmal für jedes Element in der Liste aufrufen, was für große Listen ineffizient ist. – mellamokb

Antwort

6

Crate eine Split-Funktion, die eine Zeichenfolge basierend auf einem Zeichen aufteilt.

GO 
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(8000)) 
RETURNS table 
AS 
RETURN (
    WITH splitter_cte AS (
     SELECT CHARINDEX(@sep, @s) as pos, 0 as lastPos 
     UNION ALL 
     SELECT CHARINDEX(@sep, @s, pos + 1), pos 
     FROM splitter_cte 
     WHERE pos > 0 
    ) 
    SELECT SUBSTRING(@s, lastPos + 1, 
        case when pos = 0 then 80000 
        else pos - lastPos -1 end) as chunk 
    FROM splitter_cte 
) 
GO 

SELECT * 
    FROM dbo.Split(' ', 'the quick brown dog jumped over the lazy fox') 
OPTION(MAXRECURSION 0); 

Dann nutzen Sie die Split-Funktion auf ein Komma zu brechen, dann können Sie die Ausgabe als Tabelle verwenden, die dann an den Tisch tritt, die Sie suchen.

Dies kann das Aufteilen einer kommagetrennten Liste sehr einfach machen. Dann können Sie einfach einen String mit allen durch ein Komma getrennten Werten übergeben.

Hoffe, das hilft!

0

Vielleicht könnten Sie die In operator in SQL stattdessen verwenden. Es gibt ein paar Tutorials, wie man das auch auf http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm benutzt.

+0

Wie kann ich IN Prädikat auf Komma getrennte String-Wert in der Datenbank arbeiten? – Pankaj

+0

Sie müssten dynamic sql verwenden, um dies zu erreichen, aber es ist definitiv möglich. – mellamokb

+1

@Mellamokb OP muss zuerst die Sammlung an die Datenbank übergeben. – Pankaj

0

senden XML SQL

  List<string> lst = new List<string> { 
                 "1", 
                 "2", 
                 "3" 
               }; 

      XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
      namespaces.Add(string.Empty, string.Empty); 
      StringBuilder sb = new StringBuilder(); 
      using (var sw = new StringWriter(sb)) //serialize 
      { 
       var serializer = new XmlSerializer(typeof (List<string>)); 
       serializer.Serialize(sw, lst, namespaces); 
      } 

jetzt, SB senden als param auf SQL.

das ist alles.

Verwenden Sie keine CSV.

+0

Sollte ich 'SQlBulkCopy' nicht verwenden? Senden Sie also alle Datensätze in der Datenbanktabelle und verbinden Sie sie in Ihrem Stored Proc. Initial in der Liste Parameter senden Sie eine eindeutige GUID an Stored Proc und senden Sie auch diese GUID in der Tabelle, um die verknüpften Datensätze zu verfolgen. Sobald der Job in Stored Proc ausgeführt wurde, löschen Sie einfach den zugehörigen Datensatz aus der Tabelle, bevor Sie ihn abbrechen. Was sagst du ? – Pankaj

+0

Ich sehe keine Beziehung zwischen Bulk Copy. Bulk Copy speichert die Einfügungen nicht in der LOG-Datei. Verwenden Sie keine CSV-Werte (wie von anderen vorgeschlagen). Verwenden Sie das übliche Format: XML. –

1

Sie folgenden Code verwenden: Dies funktioniert für SQL Server 2005 (und höher):

create procedure IGetAListOfStrings 
@List xml -- This will recevie a List of values 
    as 
begin 
    -- You can load then in a temp table or use it as a subquery: 
    create table #Values (ListValue nvarchar(20)); -- adjust nvarchar size 
    INSERT INTO #Values 
    SELECT DISTINCT params.p.value('.','varchar(20)') -- adjust nvarchar size 
    FROM @List.nodes('/params/p') as params(p); 
    ... 
end 

Sie müssen diese Prozedur mit einem Parameter wie folgt aufrufen:

exec IGetAListOfValues 
@List = '<params> <p>string1</p> <p>string2</p> </params>' -- xml parameter 

Die Die Knotenfunktion verwendet einen xPath-Ausdruck. In diesem Fall ist es /params/p, so dass das XML <params> als Root und <p> als Element verwendet. siehe

Weitere Informationen diese Antwort: Passing List of values to stored procedure

Verwandte Themen