2017-11-27 19 views
0

私は多数のIDを連結し、すべてのIDのステータスを更新しようとしています。例えばSQL Server 2008で8000を超える文字を格納し、大きな連結文字列を割り当てる方法は?

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)` 

私のストアドプロシージャを確認してください:

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 

の背後に私のコードを確認してください:

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列のデータ型がbigint identityです。

大きな文字列を連結して、aclidが存在するすべての行を更新してください。

+0

すぐに問題が発生するのは、文字列分割機能の動作の可能性が高いからです。しかし、もっと広い意味では、最初にすべてのIDを連結しているということですか?なぜあなたはこれをやっていて、あなたが参加できるテーブルにそれらを保持するだけではありませんか? – iamdave

+0

私の要求によると、私は選択したIDのステータスを同じテーブルに更新する必要があります。だから、私はすべての選択されたIDを連結して、一度に行を更新しようとしています。 8000文字以上の場合は、ストアドプロシージャで8000文字を超えていません。 – AkshayPorwal

+0

*だから私はすべての選択されたIDの*を連結... ....なぜですか?これを行う必要はありません。 – iamdave

答えて

0

私は、SQLで1つのユーザー定義のテーブル型とsourecodeで1つのクラスをそれぞれのデータで作成することをお勧めします。このクラスのオブジェクトをsqlに渡すことができます。また、SPでは、メインテーブルとこのテーブル(入力パラメータとして受け取る)間の結合を使用してデータを更新することができます。

+0

あなたのお返事ありがとうございました。 実際には、ストアドプロシージャで分割関数を呼び出す間、それは間違っていました。関数ではvarchar(8000)でした。 :)解決済み – AkshayPorwal

0

あなたのお返事ありがとうございました..実際には、ストアドプロシージャで分割関数を呼び出す間、それは間違っていました。関数ではvarchar(8000)でした。 :)それを解決しました。

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 
関連する問題