Tokens para SQL preenchimento declaração em branco em vez de NULL tornando-falhar
-
18-09-2019 - |
Pergunta
Eu tenho uma instrução SQL como esta:
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
Neste o $(TokenValue)
irá preencher um valor de um formulário (ignorar como ele está fazendo isso, não é importante, assim que se há um valor no campo que se refere a ele vai ficar cheia lá). Se o campo no formulário foi deixado em branco no entanto, não haverá nada colocar lá, deixando o resultado final como esta:
DECLARE @MyVariable as varchar(50)
SET @MyVariable =
em vez de
DECLARE @MyVariable as varchar(50)
SET @MyVariable = 'FormInputValue'
Uma vez que não há nada após o =, como posso explicar isso e certifique-se a instrução SQL não falhar? O token não escreve nulo para o seu lugar, sempre apenas um em branco se o campo foi deixado vazio ... Alguma idéia?
Obrigado,
Matt
Solução
Estou com medo de que você não será capaz de contornar isso.
Isso é algo que deve ser entregue no nível do aplicativo.
Se $ (TokenValue) IsNot um param, e você não incluir o "no valor de cadeia você pode tentar usar
SET @MyVariable = '$(TokenValue)'
Este não irá funcionar com todos os tipos var (int e float obras, mas não decimal)
--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
Outras dicas
Você pode tentar jogar com os parâmetros predefinidos por exemplo
create PROCEDURE dbo.test
@v varchar(50) = ''
AS
BEGIN
select @v
END
GO
e
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
Assim, no seu caso em vez de
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
Você iria acabar com
DECLARE @MyVariable as varchar(50)
declare @a table (v varchar(50))
insert into @a
exec dbo.test $(TokenValue)
select @myVariable = v from @a
Mas isso é realmente uma solução hacky. Como outros sugeriram que deveria ser, em vez filtrada a nível de aplicação
editado para SQL Server :) Se você escrever sua consulta como esta:
set @MyVariable = ''$(TokenValue)''
if @MyVariable = ''''
set @MyVariable = null
else
set @MyVariable = substring(@MyVariable,2,len(@MyVariable)-2)
Se nada está no lugar de $(TokenValue)
, você obtém:
if '''' = ''''
e @MyVariable será definido para NULL
. Se houver uma string no lugar de $(TokenValue)
, você obtém:
if '''teststring''' = ''''
^^^^^^^^^^^^
Porque ''
é o caminho para escapar de uma única citação, cada ''
resulta em uma citação em @MyVariable. Essas duas citações são arrancadas pela substring
na cláusula else
.