Fichas para sentencia SQL se llenan en blanco en lugar de hacer que choque NULL
-
18-09-2019 - |
Pregunta
Tengo una instrucción SQL como esto:
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
En este $(TokenValue)
la rellenará un valor de una forma (ignorar la forma en que lo está haciendo, que no es importante, sólo que si hay un valor en el campo que se refiere a que va a llenarse de allí). Si el campo en el formulario fue dejado en blanco sin embargo, no habrá nada puesto allí, dejando el resultado final de esta manera:
DECLARE @MyVariable as varchar(50)
SET @MyVariable =
en lugar de
DECLARE @MyVariable as varchar(50)
SET @MyVariable = 'FormInputValue'
Dado que no hay nada después del =, ¿cómo explicar que para esto y asegurarse de que la sentencia de SQL no se cuelga? El token nunca escribe nula a su lugar, siempre a un blanco si el campo se deja vacío ... ¿Alguna idea?
Gracias, Matt
Solución
Me temo que usted no será capaz de evitar esto.
Esto es algo que debe ser entregado a nivel de aplicación.
Si $ (TokenValue) IsNot un parámetro, y que no incluyen el 'en el valor de cadena puede probar a usar
SET @MyVariable = '$(TokenValue)'
Esto no funcionará con todos los tipos var (INT y obras flotador, pero no 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
Otros consejos
puede intentar jugar con los parámetros por defecto por ejemplo
create PROCEDURE dbo.test
@v varchar(50) = ''
AS
BEGIN
select @v
END
GO
y
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
Así que en su caso en lugar de
DECLARE @MyVariable as varchar(50)
SET @MyVariable = $(TokenValue)
acabaría con
DECLARE @MyVariable as varchar(50)
declare @a table (v varchar(50))
insert into @a
exec dbo.test $(TokenValue)
select @myVariable = v from @a
Pero lo que es realmente la solución hacky. Como otros sugirieron que debería ser más bien filtrada en el nivel de aplicación
Editado para SQL Server :) Si usted escribe su consulta como la siguiente:
set @MyVariable = ''$(TokenValue)''
if @MyVariable = ''''
set @MyVariable = null
else
set @MyVariable = substring(@MyVariable,2,len(@MyVariable)-2)
Si no hay nada en el lugar de $(TokenValue)
, se obtiene:
if '''' = ''''
y @MyVariable se establecerá en NULL
. Si hay una cadena en el lugar de $(TokenValue)
, se obtiene:
if '''teststring''' = ''''
^^^^^^^^^^^^
Debido ''
es la manera de escapar de una comilla simple, cada ''
resultados en una cita en @MyVariable. Esas dos frases son despojados por el substring
en la cláusula else
.