2013-08-12 3 views
2

Aujourd'hui, un bogue qui était vraiment difficile à traquer s'est manifesté dans notre projet.Paramètres SQL Server sans "@"/littéraux de chaîne

Nous avions un déclencheur qui effectuait certaines actions lorsque les données étaient insérées ou mises à jour, y compris l'appel de plusieurs procédures stockées, et le programme semblait fonctionner correctement. Sauf quand ce n'est pas le cas. Après des heures de coiffure, nous avons finalement trouvé le coupable: un "@" manquant devant un nom de paramètre dans une instruction EXEC. L'exemple minimal suivant montre le problème:

CREATE PROCEDURE EchoString @TheString nvarchar(30) 
AS 
SELECT @TheString 
GO 

declare @MyString char(10) = 'FooBar!' 

exec EchoString @MyString 
exec EchoString MyString -- Why does this work? 

Maintenant, cela m'a fait me demander: quel est le but de permettre cela? Est-ce seulement pour la rétrocompatibilité, ou y a-t-il des cas d'utilisation légitimes pour cela? Est-il documenté quelque part (mon googling faible est vide, mais "@" n'est pas tout ce que google-able.)

Répondre

6

Dans certains cas, SQL Server interprétera un tel paramètre comme une chaîne. L'exemple le plus connu:

EXEC sp_who2 active; 

est le même que:

EXEC sp_who2 'active'; 

Je ne sais pas si ce comportement est documenté mais le code écrit de cette façon est certainement à mon humble avis fragile.

+0

Merci de votre participation. +1 Si quelqu'un a des indications sur la documentation ou une justification de cette fonctionnalité, ce serait formidable; sinon j'accepterai cette réponse dans un petit moment. – Eyvind