私は多数の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が存在するすべての行を更新してください。
すぐに問題が発生するのは、文字列分割機能の動作の可能性が高いからです。しかし、もっと広い意味では、最初にすべてのIDを連結しているということですか?なぜあなたはこれをやっていて、あなたが参加できるテーブルにそれらを保持するだけではありませんか? – iamdave
私の要求によると、私は選択したIDのステータスを同じテーブルに更新する必要があります。だから、私はすべての選択されたIDを連結して、一度に行を更新しようとしています。 8000文字以上の場合は、ストアドプロシージャで8000文字を超えていません。 – AkshayPorwal
*だから私はすべての選択されたIDの*を連結... ....なぜですか?これを行う必要はありません。 – iamdave