2

我正在使用函数 sp_spaceused 来获取数据库中所有表的详细信息。index_size 列是返回的 VARCHAR,末尾带有“KB”,但我想以 MB 为单位显示。我只需要知道如何去掉 KB,剩下的我可以做!:D

更新:我不觉得这是另一个问题的重复,因为我正在寻找一个仅 SQL 的解决方案,该解决方案在这个线程中给出。

4

4 回答 4

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)
于 2009-03-05T11:44:38.600 回答
1

替换(列,'KB','')。不需要 LEN 和其他东西

在 SQL 2005 上,这将为您提供“保留”值:

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

更多调查应该允许您从目录视图中读取索引与数据空间

于 2009-03-05T11:51:43.077 回答
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
于 2009-03-05T11:56:51.037 回答
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;

这可以很容易地封装成一个标量函数。一个完全通用的函数将接受允许的字符列表,或者您可以为特殊目的进行硬编码(例如这个)。

于 2018-11-08T18:42:24.297 回答