質問
関数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;
これは、スカラー関数に簡単にカプセル化できます。完全に一般的な関数は許可された文字のリストを受け入れるか、特別な目的(このような)のためにハードコードすることができます。
所属していません StackOverflow