sql-server - proper - stuff sql server for xml path
String.IsNullOrEmpty como funciĆ³n para VARCHARs en SQL? (9)
Aquí está mi función que "extiende" ISNULL y comprueba si está vacío también. El valor de prueba se verifica en nulo y, si no es nulo, se recorta y luego se verifica la longitud.
La función devuelve la cadena de prueba si NO es nula o está vacía, de lo contrario se devuelve la segunda cadena.
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
Digamos que tengo una función o un procedimiento almacenado que admite varios parámetros de VARCHAR. Me he cansado de escribir SQL como este para probar si estos parámetros tienen un valor:
IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0
BEGIN
-- do stuff
END
Tiene que haber una mejor manera de hacer esto. No esta ahi
Aumenté la respuesta de Atron aunque técnicamente implementó IfNullOrWhiteSpace
.
Aquí está mi implementación de 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
Me doy cuenta de que esta es una pregunta antigua, pero esto es lo que uso en MSSQL: LEN(ISNULL(@asdf, ''''))>0
Ejemplo:
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
Creo que esto es más simple y más directo que las otras soluciones porque está comprobando literalmente si la cadena es nula o tiene una longitud de 0.
No es necesario verificar el valor nulo antes de llamar a LEN. Solo puede usar LEN (@SomeVarcharParm)> 0. Esto devolverá false si el valor es NULL, '''' o ''''. Esto se debe a que NULL> 0 devuelve falso. Ver por ti mismo ejecutar:
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
Puedes hacer ISNULL(@SomeVarcharParam, '''') <> ''''
o puedes crear un UDF que devuelve un poco:
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
Y IF NOT dbo.IsNullOrEmpty(@SomeVarcharParam) BEGIN ...
usando IF NOT dbo.IsNullOrEmpty(@SomeVarcharParam) BEGIN ...
Tenga en cuenta que al llamar a un UDF, DEBE prefijar al propietario (aquí, dbo).
Si estoy concatenando o uniendo una cadena en línea (dentro de una declaración de selección), y quiero verificar si la columna es NULL o Vacía, hago esto:
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'')
El NULLIF en la parte interna de la expresión forzará a la columna a NULL si está vacía, entonces la expresión ISNULL externa puede depender de una entrada consistente y reaccionar en consecuencia.
Simplemente puede hacer IF @SomeVarcharParam <> ''''
ya que la condición se evaluará como NULL
y la rama no se tomará si el parámetro es nulo
Usa esta función (basada en la de 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
como
dbo.isNullOrEmpty(@someVar)
o
WHERE dbo.isNullOrEmpty(@someVar) = 1
en un procedimiento almacenado o consulta.
IF COALESCE(@SomeVarcharParm, '''') <> ''''
BEGIN
-- do stuff
END