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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top