Tokens pour instruction SQL remplir la place en blanc de NULL faire planter
-
18-09-2019 - |
Question
J'ai une instruction SQL comme ceci:
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
Dans ce $(TokenValue)
le remplira une valeur d'une forme (ignorer la façon dont il le fait, il est pas important, juste que s'il y a une valeur dans le champ, il se rapporte à elle va se remplir là-dedans). Si le champ sous la forme a été laissée vide cependant, il n'y aura rien mis là, en laissant le résultat final comme ceci:
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 puis-je expliquer cela et assurez-vous que l'instruction SQL ne tombe pas en panne? Le jeton n'a jamais écrit nulle à sa place, toujours juste un blanc si le champ est laissé vide ... Des idées?
Merci,
Matt
La solution
Je crains que vous ne serez pas en mesure de contourner cela.
Ceci est quelque chose que devrait être remise 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 fonctionne pas avec tous les types de var (INT et travaux FLOAT, mais pas 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
Autres conseils
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
et
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
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 qui est vraiment la solution aki. Comme d'autres ont suggéré qu'il devrait être plutôt filtré sur le niveau d'application
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ésultat de ''
dans une citation à @MyVariable. Ces deux citations sont arrachés par la substring
dans la clause else
.