Gettoni per SQL riempire vuota invece di null che lo rende in crash
-
18-09-2019 - |
Domanda
Ho un'istruzione SQL come questo:
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
In questo l'$(TokenValue)
compilerà un valore da un modulo (ignorare come si sta facendo, non è importante, solo che se c'è un valore nel campo si riferisce ad esso arriveremo compilato in là). Se il campo in forma è stata lasciata in bianco però, non ci sarà niente messo lì, lasciando il risultato finale in questo modo:
DECLARE @MyVariable as varchar(50)
SET @MyVariable =
anziché
DECLARE @MyVariable as varchar(50)
SET @MyVariable = 'FormInputValue'
Dal momento che non c'è niente dopo i =, come posso spiegare questo e assicurarsi che l'istruzione SQL non in crash? Il token non scrive mai nulla al suo posto, sempre e solo uno spazio vuoto se il campo è stato lasciato vuoto ... Tutte le idee?
Grazie,
Matt
Soluzione
Temo che non sarà in grado di bypassare questo.
Questo è qualcosa che dovrebbe da consegnare a livello di applicazione.
Se $ (TokenValue) isnot un param, e non si include il 'nel valore della stringa che si può provare a utilizzare
SET @MyVariable = '$(TokenValue)'
Questo non funziona con tutti i tipi var (INT e opere FLOAT, ma non decimale)
--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
Altri suggerimenti
si può provare a giocare con parametri di default per esempio
create PROCEDURE dbo.test
@v varchar(50) = ''
AS
BEGIN
select @v
END
GO
e quindi
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
Quindi nel tuo caso invece di
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
si finirebbe con il
DECLARE @MyVariable as varchar(50)
declare @a table (v varchar(50))
insert into @a
exec dbo.test $(TokenValue)
select @myVariable = v from @a
Ma che in realtà è la soluzione hacky. Come altri hanno suggerito che dovrebbe essere piuttosto filtrato a livello di applicazione
A cura per SQL Server :) Se si scrive la query in questo modo:
set @MyVariable = ''$(TokenValue)''
if @MyVariable = ''''
set @MyVariable = null
else
set @MyVariable = substring(@MyVariable,2,len(@MyVariable)-2)
Se non si trova nel luogo di $(TokenValue)
, si ottiene:
if '''' = ''''
e @MyVariable verrà impostato su NULL
. Se c'è una stringa al posto di $(TokenValue)
, si ottiene:
if '''teststring''' = ''''
^^^^^^^^^^^^
A causa ''
è il modo per sfuggire a una sola offerta, ognuna risultati ''
in una citazione in @MyVariable. Queste due citazioni sono strappati via dalla substring
nella clausola else
.