8
votes

Existe-t-il un moyen d'empêcher SQL Server tronquant silenciant des données dans des variables locales et des paramètres de procédure stockés?

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 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.

La session SQLCMD suivante démontre ceci: P>

1> declare @s varchar(5) = '123456789';
2> print @s;
3> go
12345


2 commentaires

Dupliquer de SQL Server tronque silencieusement Varcharis dans les procédures stockées . Vous ne peut pas le faire.


@GBN: Merci d'avoir repéré le duplicata - désolé de ne pas la repérer moi-même.


5 Réponses :


1
votes

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 pour insérer dans une colonne Smallint .


0 commentaires

4
votes

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.


1 commentaires

J'avais soupçonné que c'était le cas, mais je pensais demander quand même. Merci de confirmer ma suspicion.



3
votes

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 .


0 commentaires

-1
votes

Vous pouvez utiliser à gauche dans SQL et spécifié la longueur que vous souhaitez insérer. Par exemple.

créer une table de table1 ( Test varchar (10) )

Insérer dans la table1 Valeurs (à gauche ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 10))

Cela insérera uniquement

abcdefghij sur la table


1 commentaires

La question est de demander comment empêcher 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 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.



0
votes

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'


0 commentaires