Exception exécutant une procédure stockée avec CASE passant de C # (T-SQL)

J'ai une colonne NVARCHAR (max) dans une table et une procédure stockée qui mettrait à jour cette colonne ainsi que toute autre colonne de la table en utilisant la commutation 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 

Tout est bon si j'exécute cette procédure à partir de SQL Management Studio avec

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

Je peux également mettre à jour TableName à partir du code C # en utilisant la même procédure stockée, mais quand il s'agit de mettre à jour BigNvarcharValue à partir de C #, il échoue avec SQLException que "Ssortingng ou binary data serait tronqué". Maintenant, j'ai pensé que cela a quelque chose à voir avec CASE dans cette procédure stockée, parce que quand je le casse à une procédure stockée plus simple, tout fonctionne bien:

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

J'ai lu un tas de messages du forum qui décrivent ce problème d'essayer d'insert une plus grande valeur dans la colonne NVARCHAR qui provoquerait cette exception, mais cela ne semble pas s'appliquer.

Je suis relativement nouveau à T-SQL, donc y a-t-il des limitations de CASE que je ne connais pas?

PS BigNvarcharValue est NVARCHAR (MAX) et TableName est NVARCHAR (50)

Quels sont les types de données des colonnes que vous traitez? Parce que j'ai reproduit l'erreur en essayant d'insert une valeur qui est autorisée par NVARCHAR (max) dans une colonne qui est VARCHAR (50).

Pour réitérer – NVARCHAR (max) vous permet de spécifier une valeur qui est plus longue que le type de données indiqué, c'est pourquoi vous obtenez l'erreur sur la troncature.

L'erreur le dit par lui-même, "datatables de string ou binarys seraient tronquées". Cela signifie que vous semblez insert une valeur plus grande que ce que le nvarchar(max) peut gérer.

SSMS 2008 dispose de fonctionnalités de debugging permettant de définir des points d'arrêt, etc.

Je pense que vous voudrez peut-être jeter un œil à la capacité maximale du System.Ssortingng . Ce n'est qu'une question de longueur, quelque part.

Avec exactement votre même procédure stockée et la table que vous avez décrite j'ai couru le code suivant

 class Program { static void Main(ssortingng[] 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 ssortingng('T', 80000); cmd.ExecuteNonQuery(); } } } 

Cela a bien fonctionné. Je voudrais inspecter le text de la command et la collection de parameters (nom et valeur) et vérifier que tout est comme vous le pensez.

Merci à tous pour les réponses. J'ai fini par séparer la mise à jour de la grosse colonne par une procédure individuelle, qui a résolu le problème. Je suis sûr que le coupable était avec la déclaration CAS.