2009-12-09 1 views
0

J'ai une instruction SQL comme ceci:Tokens pour instruction SQL remplir en blanc au lieu de NULL faire planter

DECLARE @MyVariable as varchar(50) 
SET @MyVariable = $(TokenValue) 

En cela, le $(TokenValue) remplira une valeur d'une forme (ignorer la façon dont il le fait, ce n'est pas important, juste que s'il y a une valeur dans le champ, cela se rapporte à ça va être rempli dedans). Si le champ sous la forme a cependant été laissée en blanc, il n'y aura rien mis là, en laissant le résultat final comme celui-ci:

DECLARE @MyVariable as varchar(50) 
SET @MyVariable = 

plutôt que

DECLARE @MyVariable as varchar(50) 
SET @MyVariable = 'FormInputValue' 

Comme il n'y a rien après le signe =, comment Je compte pour cela et assurez-vous que l'instruction SQL ne plante pas? Le jeton n'écrit jamais de nulle à sa place, toujours juste un blanc si le champ a été laissé vide ... Des idées?

Merci,
Matt

+0

Il s'avère que si je mets des citations autour du jeton comme ceci: SET @MyVariable = '$ (TokenValue)' ça marche ... se présente comme une chaîne vide à la place de rien. Je pense que ça n'a rien à voir avec le fonctionnement de ces tokens, ils ne sont pas géniaux. – Matt

+0

Il s'avère que certaines réponses ont précisé que ... –

+0

Oui, je peux voir votre réponse après avoir posté le commentaire. Merci de le signaler :) – Matt

Répondre

0

Je crains que vous ne serez pas en mesure de contourner cela.

Ceci est quelque chose que devrait être remis au niveau de l'application.

Si $ (TokenValue) IsNot un param, et vous ne comprennent pas »dans la valeur de chaîne que vous pouvez essayer d'utiliser

SET @MyVariable = '$(TokenValue)' 

Cela ne fonctionnera pas avec tous les types var (INT et FLOTTE travaux, mais non décimal)

--WORKS 
DECLARE @MyVariable as INT 
SET @MyVariable = '' 
SELECT @MyVariable 
--WORKS 
DECLARE @MyVariable as FLOAT 
SET @MyVariable = '' 
SELECT @MyVariable 
--DOES NOT WORK 
DECLARE @MyVariable as DECIMAL(18,8) 
SET @MyVariable = '' 
SELECT @MyVariable 
0

Edité pour SQL Server :) Si vous écrivez votre requête comme ceci:

set @MyVariable = ''$(TokenValue)'' 
if @MyVariable = '''' 
    set @MyVariable = null 
else 
    set @MyVariable = substring(@MyVariable,2,len(@MyVariable)-2) 

Si rien est à la place de $(TokenValue), vous obtenez:

if '''' = '''' 

et @MyVariable sera réglé sur NULL. S'il y a une chaîne dans le lieu de $(TokenValue), vous obtenez:

if '''teststring''' = '''' 
    ^^^^^^^^^^^^ 

Parce que '' est le moyen d'échapper à une seule citation, chaque '' résultats dans une citation à @MyVariable. Ces deux guillemets sont supprimés par le substring dans la clause else.

1

vous pouvez essayer de jouer avec les paramètres par défaut par exemple

create PROCEDURE dbo.test 
    @v varchar(50) = '' 
AS 
BEGIN 
    select @v 
END 
GO 

puis

declare @a table (v varchar(50)) 

insert into @a 
exec dbo.test -- that represents scenario with no token 

insert into @a 
exec dbo.test 'blah' -- that if there is a token 

select * from @a 

Donc, dans votre cas, au lieu de

DECLARE @MyVariable as varchar(50) 
SET @MyVariable = $(TokenValue) 

vous finiriez avec

DECLARE @MyVariable as varchar(50) 
declare @a table (v varchar(50)) 
insert into @a 
exec dbo.test $(TokenValue) 
select @myVariable = v from @a 

Mais c'est vraiment une solution hacky. Comme d'autres suggéré il devrait plutôt être filtré au niveau de l'application

+0

+1 Certainement moins hacky que ma réponse;) – Andomar

Questions connexes