テーブルに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)です。