Eliminar caracteres no numéricos en T-SQL
Pregunta
Estoy usando la función sp_spaceused para obtener los detalles de todas las tablas en una base de datos. La columna index_size es VARCHAR devuelta completa con 'KB' al final, sin embargo, quiero mostrar en MB. Todo lo que necesito saber es cómo quitar la KB, ¡yo puedo hacer el resto! : D
ACTUALIZACIÓN: no creo que este sea un duplicado de la otra pregunta sugerida ya que estaba buscando una solución solo para SQL, que se proporcionó en este hilo.
Solución
REPLACE (columna, 'KB', ''). No hay necesidad de LEN y otras cosas
En SQL 2005, esto le dará el " reservado " valor:
SELECT
SUM(au.total_pages) / 128.0 AS UsedMB
FROM
sys.allocation_units au
Un poco más de investigación debería permitirte leer el índice frente al espacio de datos fuera de las vistas de catlog también
Otros consejos
Mi primer pensamiento sería simplemente almacenar en una variable y usar la subcadena para eliminar los últimos caracteres.
-- Setup
DECLARE @data VARCHAR(50)
SET @data = '159736 KB'
-- Computation
SET @data = SUBSTRING(@data, 1, LEN(@data)-2)
-- Conversion
SELECT CAST(@data AS INTEGER)
Solución más genérica:
-- Test data
DECLARE @StrIn VARCHAR(100), @StrOut VARCHAR(100), @I INT, @Len INT
SELECT @StrIn = '123m43 5m409', @StrOut = '', @I = 0, @Len = Len(@StrIn)
-- Answer
WHILE (@I < @Len) BEGIN
SELECT @I = @I + 1,
@StrOut = @StrOut +
CASE
WHEN (CAST(ASCII(SUBSTRING(@StrIn, @I, 1)) AS INT) BETWEEN 47 AND 58)
THEN SUBSTRING(@StrIn, @I, 1) ELSE ''
END
END
SELECT @StrIn, @StrOut
Solución general para T-SQL (SS 2008+), para eliminar todos menos un conjunto de caracteres permitidos:
DECLARE @StrIn varchar(20)='(323)-555-1212'; -- input value
DECLARE @Allowed varchar(20)='%[0123456789]%'; -- pattern for allowed characters.
DECLARE @Result varchar(20)=''; -- result
DECLARE @I int = patindex(@Allowed, @StrIn);
WHILE (@I>0)
begin
SET @Result = @Result + SUBSTRING(@StrIn, @I, 1); -- add allowed charcter.
set @StrIn = SUBSTRING(@StrIn, @I+1, 20); -- take rest of string.
SET @i = patindex(@Allowed, @StrIn);
END
PRINT @Result;
Esto podría encapsularse fácilmente en una función escalar. Una función completamente general aceptaría la lista de caracteres permitidos, o podría codificar con un propósito especial (como este).