إزالة الأحرف غير رقمية في T-SQL
سؤال
وأنا باستخدام وظيفة sp_spaceused للحصول على تفاصيل من كافة الجداول في DB. العمود index_size يتم إرجاع VARCHAR الكامل مع "KB" في نهاية المطاف، ولكن أريد أن لعرضها في MB. كل ما تحتاج إلى معرفته هو كيفية تجريد خارج KB، ويمكنني أن تفعل بقية! : D
وUPDATE: أنا لا أشعر هذا هو نسخة مكررة من مسألة أخرى اقترح بينما كنت تبحث عن الحل SQL فقط، والتي أعطيت في هذا الموضوع
المحلول
واستبدال (العمود، '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;
ويمكن بسهولة مغلفة هذا في وظيفة العددية. ومن شأن الوظيفة العامة تماما يقبل قائمة الأحرف المسموح بها، أو هل يمكن بجد رمز لأغراض خاصة (مثل هذه).