1

テーブルにNVARCHAR(max)列があり、この列とCASEスイッチングを使用してテーブル内の他の列を更新するストアドプロシージャがあります。

CREATE PROCEDURE updateTable
   @columnName sysname,
   @value nvarchar(max)
AS 
   UPDATE [dbo].[TestTable]
   SET 
      BigNvarcharValue = CASE @columnName WHEN 'BigNvarcharValue' THEN @value ELSE BigNvarcharValue END,  
      TableName = CASE @columnName WHEN 'TableName' THEN @value ELSE TableName END

SQL Management Studioからこの手順を実行すると、すべて問題ありません。

EXEC [dbo].[updateTable]
     @columnName = 'BigNvarcharValue',
     @value = N'SOME BIG 80Kb value'

同じストアドプロシージャを使用してC#コードからTableNameを更新することもできますが、C#からこのBigNvarcharValueを更新する場合、「文字列またはバイナリデータが切り捨てられる」というSQLExceptionで失敗します。これで、このストアドプロシージャのCASEと関係があることがわかりました。これは、より単純なストアドプロシージャに分割すると、すべてが正常に機能するためです。

CREATE PROCEDURE updateTable   
     @columnName sysname,   
     @value nvarchar(max)
AS       
   UPDATE [dbo].[TestTable]   
   SET BigNvarcharValue=@value

この例外の原因となるNVARCHAR列に大きな値を挿入しようとするこの問題について説明しているフォーラムの投稿をたくさん読みましたが、当てはまらないようです。

私はT-SQLにかなり慣れていないので、私が知らないCASEの制限はありますか?

PS BigNvarcharValueはNVARCHAR(MAX)であり、TableNameはNVARCHAR(50)です。

4

4 に答える 4

1

エラーはそれ自体で「文字列またはバイナリデータは切り捨てられる」と言っています。これは、nvarchar(max)が処理できる値よりも大きな値を挿入しているように見えることを意味します。

SSMS 2008には、ブレークポイントなどを設定できるデバッグ機能がいくつかあります。

System.Stringどちらも最大容量に目を向けたいと思うかもしれません。これは、どこかで長さの問題にすぎません。

于 2010-10-26T00:07:24.447 に答える
1

扱っている列のデータ型は何ですか?NVARCHAR(max)で許可されている値をVARCHAR(50)の列に挿入しようとして、エラーを再現したためです。

繰り返しになりますが、NVARCHAR(max)を使用すると、指定されたデータ型よりも長い値を指定できます。そのため、切り捨てに関するエラーが発生します。

于 2010-10-26T00:14:23.560 に答える
1

まったく同じストアドプロシージャと説明したテーブルを使用して、次のコードを実行しました

class Program
    {
    static void Main(string[] args)
    {

        using(SqlConnection cnn = new SqlConnection(@"Server=.;Database=test;Trusted_Connection=True;"))
        {
            cnn.Open();
            SqlCommand cmd = new SqlCommand("updateTable",cnn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@columnName",
                   System.Data.SqlDbType.NVarChar, 128));

            cmd.Parameters["@columnName"].Value = "BigNvarcharValue";

            cmd.Parameters.Add(new SqlParameter("@value",  
                     System.Data.SqlDbType.NVarChar, -1));
            cmd.Parameters["@value"].Value = new string('T', 80000);

            cmd.ExecuteNonQuery();



        }

    }
}

それはうまくいきました。コマンドテキストとパラメーターコレクション(名前と値)を調べて、すべてが思ったとおりであることを確認します。

于 2010-10-26T03:27:22.110 に答える
0

回答ありがとうございます。大きな列の更新を個別の手順に分離することになり、問題は解決しました。犯人はCASEステートメントにあったと確信しています。

于 2010-10-27T23:23:37.093 に答える