Suppression de caractères non numériques dans T-SQL
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.
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).