我正在使用函数sp_spaceused来获取数据库中所有表的详细信息。 index_size列是VARCHAR,最后返回完成'KB',但我想以MB显示。我需要知道的是如何剥离KB,我可以做其余的事! :d
更新:我不认为这是建议的其他问题的重复,因为我正在寻找一个只有SQL的解决方案,这是在这个帖子中给出的。
答案 0 :(得分:1)
我的第一个想法是只存储一个变量,只使用子字符串删除最后的字符。
-- Setup
DECLARE @data VARCHAR(50)
SET @data = '159736 KB'
-- Computation
SET @data = SUBSTRING(@data, 1, LEN(@data)-2)
-- Conversion
SELECT CAST(@data AS INTEGER)
答案 1 :(得分:1)
REPLACE(列,'KB','')。不需要LEN和其他东西
在SQL 2005上,这将为您提供“保留”值:
SELECT
SUM(au.total_pages) / 128.0 AS UsedMB
FROM
sys.allocation_units au
更多的调查应该允许您从catlog视图中读取索引与数据空间
答案 2 :(得分:0)
更通用的解决方案:
-- 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
答案 3 :(得分:0)
用于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;
可以很容易地将其封装为标量函数。一个完全通用的功能将接受允许的字符列表,或者您可以为特殊目的硬编码(如此代码)。