J'ai récemment rencontré un problème tout en portant une application sur SQL Server. Il s'est avéré que cette question a été causée par un paramètre de procédure stockée étant déclarée trop courte pour que les données soient transmises à celle-ci: le paramètre a été déclaré comme La session SQLCMD suivante démontre ceci: P> varchar (100) code> mais dans un cas a été passé plus que 100 caractères de données. Ce qui m'a surpris était que SQL Server n'a signalé aucune erreur ni avertissements - cela a juste tronqué silencieusement les données à 100 caractères.
1> declare @s varchar(5) = '123456789';
2> print @s;
3> go
12345
5 Réponses :
Je ne sais pas d'une façon de faire le serveur le faire, mais j'utilise la fonctionnalité de projets SQL Server de Visual Studio Team System System Developer Edition. Il comprend une analyse de code qui a attrapé un problème de troncature de la mine: à l'aide d'un paramètre int code> pour insérer dans une colonne code> Smallint code>. P>
SQL Server n'a pas une telle option. Vous devrez soit vérifier manuellement la longueur des chaînes de votre procédure stockée, de la manière à gérer les chaînes plus longues ou utilisez l'option NVARCHAR (MAX). Si l'espace disque n'est pas un problème, l'option NVARCHAR (MAX) est certainement la solution la plus simple et la plus rapide. P>
J'avais soupçonné que c'était le cas, mais je pensais demander quand même. Merci de confirmer ma suspicion.
Vous n'êtes pas obligé d'utiliser NvarchaRar (max), utilisez simplement Nvarparar (longueur + 1) [par exemple. Si votre longueur de colonne est 50, vous définissez le paramètre pour être NVARCHAR (51)]. Voir la réponse de davidhyogo - SQL Server tronque silencieusement Varcharis dans les procédures stockées a>. p>
Vous pouvez utiliser à gauche dans SQL et spécifié la longueur que vous souhaitez insérer. Par exemple. P>
créer une table de table1 ( Test varchar (10) ) p>
Insérer dans la table1 Valeurs (à gauche ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 10)) P>
Cela insérera uniquement p>
abcdefghij sur la table p>
La question est de demander comment empêcher i> SQL de tronquer des chaînes tronquantes implicitement et silencieusement transmis aux procédures stockées. Cette réponse indique comment tronquer explicitement les chaînes. Si i> SQL Server Comportement était différent et la question était "Comment empêcher une erreur lorsque je passe une chaîne trop longue" Ce serait une réponse applicable.
Bien que gênant, vous pouvez cependant vérifier de manière dynamique la longueur du paramètre avant un appel, par exemple
CREATE FUNCTION MyFunction(@MyParameter varchar(10))
RETURNS int
AS
BEGIN
RETURN LEN(@MyParameter)
END
GO
DECLARE @MyValue varchar(15) = '123456789012345'
DECLARE @ParameterMaxLength int
SELECT @ParameterMaxLength = CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.PARAMETERS
WHERE SPECIFIC_SCHEMA = 'dbo' AND
SPECIFIC_name = 'MyFunction' AND
PARAMETER_NAME = '@MyParameter'
IF @ParameterMaxLength <> -1 AND
LEN(@MyValue) > @ParameterMaxLength
PRINT 'It''s too looooooooooooooooooong'
Dupliquer de SQL Server tronque silencieusement Varcharis dans les procédures stockées . Vous ne peut pas b> le faire.
@GBN: Merci d'avoir repéré le duplicata - désolé de ne pas la repérer moi-même.