Removendo caracteres não-numéricos em T-SQL
Pergunta
Eu estou usando a função sp_spaceused para obter os detalhes de todas as tabelas em um DB. A coluna index_size é VARCHAR retornou completo com 'KB' no final, no entanto eu quero para exibir em MB. Todos necessidade I saber é como retirar o KB, eu posso fazer o resto! : D
UPDATE:. Eu não sinto que esta é uma duplicata da outra pergunta sugerida como eu estava à procura de um SQL única solução, que foi dada neste segmento
Solução
Substituir (coluna, 'KB', ''). Não há necessidade de LEN e outras coisas
No SQL 2005, isso vai lhe dar o valor "reservado":
SELECT
SUM(au.total_pages) / 128.0 AS UsedMB
FROM
sys.allocation_units au
Alguns mais investigação deve permitir que você leia índice vs espaço de dados fora das vistas Catlog demasiado
Outras dicas
Meu primeiro pensamento seria apenas para armazenar em em uma variável e usar apenas substring para remover os ú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)
solução mais 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
solução geral para a T-SQL (SS 2008+), para remover todos, mas um 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;
Esta poderia ser facilmente encapsulado em uma função escalar. Uma função completamente geral aceitaria a lista de caracteres permitido, ou você pode codificar para fins especiais (como este).