Удаление нечисловых символов в T-SQL

Я использую функцию sp_spaceused для получения сведений обо всех таблицах в БД. Столбец index_size представляет собой VARCHAR, возвращаемый вместе с «КБ» в конце, однако я хочу отображать в МБ. Все, что мне нужно знать, это как вырезать KB, остальное я могу сделать! :D

ОБНОВЛЕНИЕ: я не считаю, что это дубликат другого предложенного вопроса, поскольку я искал решение только для SQL, которое было дано в этой теме.


person lappy    schedule 05.03.2009    source источник
comment
Возможный дубликат: stackoverflow.com/questions/106206/   -  person Jon Schneider    schedule 05.05.2015


Ответы (4)


ЗАМЕНИТЬ(столбец, 'КБ', ''). Нет необходимости в LEN и других вещах

В SQL 2005 это даст вам «зарезервированное» значение:

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

Еще одно исследование должно позволить вам читать индекс и пространство данных из представлений каталога.

person gbn    schedule 05.03.2009

Моей первой мыслью было просто сохранить в переменной и просто использовать подстроку для удаления последних символов.

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

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

-- Conversion
SELECT CAST(@data AS INTEGER)
person sisve    schedule 05.03.2009

Более универсальное решение:

-- 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
person Maksym Gontar    schedule 05.03.2009

Общее решение для T-SQL (SS 2008+), чтобы удалить все, кроме набора разрешенных символов:

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;

Это может быть легко инкапсулировано в скалярную функцию. Полностью общая функция будет принимать список разрешенных символов, или вы можете жестко закодировать для специальной цели (например, этот).

person RBerman    schedule 08.11.2018