Question

J'utilise la fonction sp_spaceused pour obtenir les détails de toutes les tables d'une base de données. La colonne index_size est renvoyée par VARCHAR avec 'KB' à la fin, mais je souhaite l'afficher en Mo. Tout ce que j'ai besoin de savoir, c'est comment retirer le KB, je peux faire le reste! : D

MISE À JOUR: Je ne pense pas qu'il s'agisse d'une duplication de l'autre question suggérée, alors que je cherchais une solution uniquement basée sur SQL, qui a été fournie dans ce fil de discussion.

Était-ce utile?

La solution

REMPLACER (colonne, 'KB', ''). Pas besoin de LEN et d'autres choses

Sous SQL 2005, cela vous donnera le code "réservé". valeur:

SELECT
    SUM(au.total_pages) / 128.0 AS UsedMB
FROM
    sys.allocation_units au

Un peu plus d'investigation devrait vous permettre de lire aussi l'index par rapport à l'espace de données à partir des vues catlog

Autres conseils

Ma première pensée serait de simplement stocker dans une variable et d’utiliser une sous-chaîne pour supprimer les derniers caractères.

-- Setup
DECLARE @data VARCHAR(50)
SET @data = '159736 KB'

-- Computation
SET @data = SUBSTRING(@data, 1, LEN(@data)-2)

-- Conversion
SELECT CAST(@data AS INTEGER)

Solution plus générique:

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

Solution générale pour T-SQL (SS 2008+), pour supprimer tout sauf un ensemble de caractères autorisés:

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;

Cela pourrait facilement être encapsulé dans une fonction scalaire. Une fonction complètement générale accepterait la liste de caractères autorisée ou vous pourriez coder en dur dans un but spécifique (comme celui-ci).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top