2017-11-27 1 views
0

Ich versuche, die große Anzahl von id'd zu verketten und den Status aller IDs zu aktualisieren.Wie Sie mehr als 8000 Zeichen speichern und große verkettete Zeichenfolge in SQL Server 2008 zuweisen?

Zum Beispiel:

aclid in (4604019,4604018,4604017,4604016,4604015,4604014,4604013,4604012,4604011,4604010,4604009,4604008,4604007,4604006,4604005,4604004,4604003,4604002,4604001,4604000,4603999,4603998,4603997,4603996,4603995,4603994,4603993,4603992,4603991,4603990,4603989,4603988)` 

Bitte meine gespeicherten Prozedur überprüfen:

ALTER PROCEDURE [dbo].[VT_ACLReportChangeStatus] 
    (@ChangeStatus nvarchar(50) = null, 
    @ACLId nvarchar(max)) 
AS 
    /* Exec VT_ACLReportChangeStatus 'Complete','4599473,4599472,4599471,4599469,4599468' */ 
BEGIN 
    UPDATE VT_ACLReport 
    SET Status = @ChangeStatus 
    WHERE ACLId IN (SELECT * FROM SplitDelimiterString(@ACLId,',')) 
END 

Bitte meinen Code hinter überprüfen:

ACLId = ACLId.ToString().Trim(','); 

using (SqlConnection con = new SqlConnection(cs)) 
{ 
    cmd = new SqlCommand("VT_ACLReportChangeStatus", con); 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandTimeout = 3600; 

    cmd.Parameters.Add(new SqlParameter("@ACLId", SqlDbType.NVarChar,-1)); 
    cmd.Parameters.Add(new SqlParameter("@ChangeStatus", SqlDbType.NVarChar, 50)); 
    cmd.Parameters["@ACLId"].Value = ACLId; 
    cmd.Parameters["@ChangeStatus"].Value = ddlChangeStatus.SelectedItem.Text.ToString(); 

    con.Open(); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 
} 

AclId Spaltendatentyp bigint identity ist.

Bitte helfen Sie mir bei der Verkettung großer Strings und um alle Zeilen zu aktualisieren, deren aclid vorhanden ist.

+0

In der unmittelbaren, ist Ihr Problem höchstwahrscheinlich mit, wie Ihre String-Split-Funktion funktioniert. In einem breiteren Sinne ist Ihr Problem jedoch, dass Sie alle Ihre IDs miteinander verketten? Warum tust du das und hältst sie nicht nur in einer Tabelle, der du beitreten kannst? – iamdave

+0

Gemäß meiner Anforderung muss ich den Status ausgewählter IDs in derselben Tabelle aktualisieren. Also habe ich alle ausgewählten IDs verkettet und dann versucht, die Zeilen auf einmal zu aktualisieren. aber das Problem kommt, wenn die mehr als 8000 Zeichen, es nicht mehr als 8000 Zeichen in der gespeicherten Prozedur dauert. – AkshayPorwal

+0

* Also habe ich alle ausgewählten IDs verkettet * .... warum? Es besteht keine Notwendigkeit, dies zu tun. – iamdave

Antwort

0

Ich würde vorschlagen, erstellen Sie einen benutzerdefinierten Tabellentyp in SQL und eine Klasse in sourecode mit Ihren jeweiligen Daten. Sie können ein Objekt dieser Klasse an sql übergeben und in Ihrem SP können Sie die Verbindung zwischen der Haupttabelle und dieser Tabelle (die als Eingabeparameter empfangen wird) verwenden, um Daten zu aktualisieren.

+0

Danke euch allen für eure Antworten. Eigentlich war es ein dummer Fehler beim Aufrufen der Splitting-Funktion im Stored Procedure. In der Funktion war es varchar (8000). :) löste es .. – AkshayPorwal

0

Vielen Dank Ihnen für Ihre Antworten .. Eigentlich war es dummer Fehler, während Splitting-Funktion in Stored Procedure aufrufen. In der Funktion war es varchar (8000). :) Ich habe es gelöst.

ALTER FUNCTION [dbo].[SplitDelimiterString] (@StringWithDelimiter VARCHAR(max), @Delimiter VARCHAR(max)) 
RETURNS @ItemTable TABLE (Item VARCHAR(max)) 
AS 
BEGIN 
    DECLARE @StartingPosition INT; 
    DECLARE @ItemInString VARCHAR(max); 
    SELECT @StartingPosition = 1; 
    --Return if string is null or empty 
    IF LEN(@StringWithDelimiter) = 0 OR @StringWithDelimiter IS NULL RETURN; 
    WHILE @StartingPosition > 0 
    BEGIN 
     --Get starting index of delimiter .. If string 
     --doesn't contain any delimiter than it will returl 0 
     SET @StartingPosition = CHARINDEX(@Delimiter,@StringWithDelimiter); 

     --Get item from string   
     IF @StartingPosition > 0     
      SET @ItemInString = SUBSTRING(@StringWithDelimiter,0,@StartingPosition) 
     ELSE 
      SET @ItemInString = @StringWithDelimiter; 
     --If item isn't empty than add to return table  
     IF(LEN(@ItemInString) > 0) 
      INSERT INTO @ItemTable(Item) VALUES (@ItemInString);    

     --Remove inserted item from string 
     SET @StringWithDelimiter = SUBSTRING(@StringWithDelimiter,@StartingPosition + 
        LEN(@Delimiter),LEN(@StringWithDelimiter) - @StartingPosition) 

     --Break loop if string is empty 
     IF LEN(@StringWithDelimiter) = 0 BREAK; 
    END 

    RETURN 
END 
Verwandte Themen