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.

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top