質問

関数sp_spaceusedを使用して、DB内のすべてのテーブルの詳細を取得しています。 index_size列は、末尾に「KB」が付いた完全なVARCHARで返されますが、MB単位で表示したいです。知っておく必要があるのは、KBを削除する方法だけです。残りはできます。 :D

更新:これは、このスレッドで提供されたSQLのみのソリューションを探していたときに提案された他の質問と重複しているとは思わない。

役に立ちましたか?

解決

REPLACE(列、 'KB'、 '')。 LENやその他のものは必要ありません

SQL 2005では、これにより「予約済み」が表示されます。値:

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

さらに調査を行うと、catlogビューからインデックスとデータ領域を読み取ることができるはずです

他のヒント

最初に考えたのは、変数に格納し、サブストリングを使用して最後の文字を削除することです。

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

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

-- Conversion
SELECT CAST(@data AS INTEGER)

より一般的なソリューション:

-- 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

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;

これは、スカラー関数に簡単にカプセル化できます。完全に一般的な関数は許可された文字のリストを受け入れるか、特別な目的(このような)のためにハードコードすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top