2011-03-24 1 views
3

Obtenir très ennuyé avec cette requête simple ...
Je dois ajouter un décalage à un varchar, si c'est un nombre et ne rien faire est-ce pas.
Pour cette raison, j'ai créé la fonction suivante dans SQL-server. je puis extraire la réponse avec: select dbo.OffsetKPL("100",200)IsNumeric ne fonctionne pas dans le serveur SQL

Toutefois, cela ne fonctionne pas, je reçois l'erreur

Msg 207, niveau 16, état 1, ligne 1
nom de colonne non valide '100'.

Le code de la fonction est la suivante ...

ALTER FUNCTION [dbo].[OffsetKPL](
    @kpl varchar(20) 
    ,@offset int = 0 
) 
RETURNS varchar(20) 
AS 
BEGIN 
    DECLARE @uitkomst varchar(20); 

    set @uitkomst = @kpl; 
    if not(@offset = 0) begin 
    if (IsNumeric(@uitkomst) = 1) begin 
     set @uitkomst = cast((cast(@kpl as int) + @offset) as varchar); 
    end; 
end; 

RETURN @uitkomst; 

END 

Qu'est-ce qui ne va pas? nulle part ne dit que IsNumeric n'accepte pas de variable.

+1

utilisez '100' au lieu de '100'? – cairnz

Répondre

7

Utilisez des guillemets simples pour les chaînes!

select dbo.OffsetKPL('100',200) 

Si vous avez QUOTED_IDENTIFIER sur (la valeur par défaut) les choses entre guillemets devraient être des noms d'objet.

isnumeric peut ne pas être ce dont vous avez besoin bien que toutes sortes de choses inattendues retournent 1 pour cela.

SELECT ISNUMERIC('$'), ISNUMERIC('.'), 
     ISNUMERIC('12d5'), ISNUMERIC(','), ISNUMERIC('1e1') 

Voir IsNumeric() Broken? Only up to a point pour une discussion sur ce point.

+0

Yep ça marche, j'étais vraiment stuckenstein pendant un moment, de toute façon c'est ce que j'ai pour enlever mon chapeau de papier d'aluminium. – Johan

+1

Je connais l'état de borken de IsNumeric, mais pour le but j'en ai besoin car je n'ai jamais pensé aux "problèmes, travaillent habituellement dans MySQL. – Johan

Questions connexes