"La troncature NVARCHAR(MAX) se produit toujours : compréhension de la conversion implicite"
Malgré l'idée fausse selon laquelle NVARCHAR(MAX) dans les versions modernes de SQL Server contient des données substantielles, les utilisateurs peuvent rencontrer une troncature à 4 000 caractères comme dans celui-ci exemple :
DECLARE @Query NVARCHAR(max); SET @Query = 'SELECT...' -- some of the query gets set here SET @Query = @Query + '...' -- more query gets added on, etc. -- later on... PRINT LEN(@Query) -- Prints out 4273, which is correct as far as I can tell PRINT @Query -- Truncates value to 4000 characters EXEC sp_executesql @Query -- totally crashes due to malformed (truncated) query
La cause profonde : conversion implicite
Le problème vient de la conversion implicite. Lors de la concaténation de chaînes avec des caractères Unicode, SQL Server convertit automatiquement le résultat en NVARCHAR(4000) sans avertissement ni indication de troncature. Cela se produit même lorsque la variable déclarée pour stocker le résultat est NVARCHAR(MAX).
Solution : Appliquer la conversion explicite
Pour empêcher la conversion implicite et garantir la conservation des données volumineuses données, toujours pré-concaténer à l'aide de CAST :
SET @Query = CAST('' as nVarChar(MAX)) -- Force implicit conversion to nVarChar(MAX) + 'SELECT...' -- some of the query gets set here + '...' -- more query gets added on, etc.
En convertissant une chaîne vide en NVARCHAR(MAX), SQL Server est explicitement chargé de gérer la chaîne entière comme NVARCHAR(MAX). Cela élimine le problème de troncature.
Autres considérations
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!