2011-07-28 9 views
13

Dire che ho una funzione o una stored procedure che accetta diversi parametri VARCHAR. Ho ottenuto stanco di scrivere SQL come questo per verificare se tali parametri hanno un valore:String.IsNullOrEmpty come funzione per VARCHAR in SQL?

IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0 
BEGIN 
    -- do stuff 
END 

Ci deve essere un modo migliore per fare questo. Non c'è?

+0

Gosh, avrei dovuto saperlo. Entrambe le risposte funzionano, ovviamente. Ho accettato la risposta di Joe da quando ha postato per primo. –

+0

Vedere il mio commento sulla risposta di Derek. –

risposta

21

Si può fare ISNULL(@SomeVarcharParam, '') <> '' oppure è possibile creare una funzione definita dall'utente che restituisce un po ':

create function dbo.IsNullOrEmpty(@x varchar(max)) returns bit as 
BEGIN 
IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0 
    RETURN 0 
ELSE 
    RETURN 1 
END 

E non chiamate che utilizzando IF NOT dbo.IsNullOrEmpty(@SomeVarcharParam) BEGIN ...

Tenete a mente che quando si chiama un'UDF, si MUST prefisso il proprietario di esso (qui, dbo.)

+0

Avresti dovuto enfatizzare il 'ISNULL()' un po 'di più perché 'COALESCE' lo usa, rendendo quindi' ISNULL() 'più efficiente. Conseguentemente, ['IsNull' è più veloce] (http://www.bennadel.com/blog/196-SQL-COALESCE-Very-Cool-But-Slower-Than-ISNULL-.htm) –

+0

@Justin Satyr: Adam Machanic [dimostrato] (http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx) che il 'ISNULL' è solo il 10-12% più veloce di' COALESCE' e, nelle sue parole, "Difficilmente vale il sacrificio di funzionalità e standard di conformità". Inoltre, come Adam indica nei commenti successivi sull'articolo, la differenza è andata completamente in SQL Server 2008 ed entrambi hanno prestazioni praticamente identiche. –

+0

@Joe, non intendevo che il richiedente cambiasse effettivamente la risposta che accettava ... In ogni caso, * se * è vero che 'COALESCE' si riferisce alla funzione' ISNULL', quindi anche se la differenza è O (1), 'ISNULL' è ancora migliore per la stessa ragione per cui' return true' è meglio di 'return FunctionThatReturnsTrue()'. È meno ridondante. Nel tuo utilizzo, non hai mai avuto bisogno della funzionalità a più valori di 'COALESCE'. Ma c'è una preoccupazione valida per quanto riguarda gli standard. –

7
IF COALESCE(@SomeVarcharParm, '') <> '' 
BEGIN 
    -- do stuff 
END 
3

Se concatenazione o coalescenza di una stringa in linea (entro un'istruzione Select), e voglio verificare se la colonna è nullo o vuoto, faccio questo:

ISNULL('starting to build string ' 
+ NULLIF(some_table..some_col_that_might_be_null_or_empty, '') 
, 'string to append if the resulting concatenation is null') 

La NULLIF sulla parte interna dell'espressione costringerà la colonna di essere NULL se è vuoto, allora l'espressione ISNULL esterna può dipendere da input coerenti e reagire di conseguenza.

0

Mi rendo conto che è una vecchia questione, ma questo è quello che io uso in MSSQL: LEN(ISNULL(@asdf, ''))>0

Esempio:

DECLARE @asdf varchar(10) 
SET @asdf = NULL --You can change this value to test different outputs 

BEGIN IF LEN(ISNULL(@asdf, '')) > 0 
    PRINT @asdf 
ELSE 
    PRINT 'IS NullOrEmpty' 
END 

--You can use it inline like this: 
PRINT CASE LEN(ISNULL(@asdf, '')) WHEN 0 THEN 'IS NullOrEmpty' ELSE @asdf END 

credo che questo sia più semplice e più dritto in avanti rispetto alle altre soluzioni perchè sta letteralmente controllando se la stringa è nullo o ha una lunghezza pari a 0.

1

Ecco la mia funzione che "estende" ISNULL e controlla anche vuoto. Il valore di test viene controllato per null e se non è nullo viene tagliato e quindi controllato per la lunghezza.

La funzione restituisce la stringa di test se NON è Null o Empty, altrimenti viene restituita la seconda stringa.

CREATE FUNCTION [dbo].[ISNULLOREMPTY] 
( 
    @value NVARCHAR(max), 
    @return NVARCHAR(max) 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 

IF (@value IS NULL) 
BEGIN 
    RETURN @return 
END 
ELSE 
BEGIN 
    IF (LEN(LTRIM(@value)) = 0) 
    BEGIN 
     RETURN @return 
    END 
END 

RETURN @value; 
END 
GO 
0

Non è necessario verificare la presenza di null prima di chiamare LEN. Puoi semplicemente usare LEN (@SomeVarcharParm)> 0. Questo restituirà false se il valore è NULL, '' o ''. Questo perché NULL> 0 restituisce false. Guardate voi stessi eseguire:

SELECT 
CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END, 
CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END, 
CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END, 
CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END, 
CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END 
0

Si può solo fare IF @SomeVarcharParam <> '' poiché la condizione valuterà al NULL e il ramo non sarà presa se il parametro è nullo

0

ho upvoted risposta di Atron anche se tecnicamente implementato IfNullOrWhiteSpace .

Ecco la mia implementazione di IfNullOrEmpty():

IF EXISTS (SELECT * FROM sys .objects WHERE object_id = OBJECT_ID(N'[dbo].[IfNullOrEmpty]') and type in (N'FN')) 
    DROP FUNCTION dbo.IfNullOrEmpty 
go 

CREATE FUNCTION dbo.IfNullOrEmpty(@value varchar(max), @substitute varchar(max)) returns varchar(max) as 
BEGIN 
    IF @value IS NOT NULL AND LEN(@value) > 0 
     RETURN @value 
    RETURN @substitute 
END 
0

Usare questa funzione (sulla base di Derek):

CREATE FUNCTION dbo.isNullOrEmpty(@x varchar(max)) RETURNS BIT AS 
BEGIN 
    IF @x IS NOT NULL AND LEN(@x) > 0 
     RETURN 0 

    RETURN 1 
END 

come

dbo.isNullOrEmpty(@someVar) 

o

WHERE dbo.isNullOrEmpty(@someVar) = 1 

in una stored procedure o query.