Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 删除T-SQL中的非数字字符_Tsql_Varchar - Fatal编程技术网

Tsql 删除T-SQL中的非数字字符

Tsql 删除T-SQL中的非数字字符,tsql,varchar,Tsql,Varchar,我使用函数sp_space来获取数据库中所有表的详细信息。index_size列返回的是VARCHAR,末尾带有“KB”,但我希望以MB为单位显示。我所需要知道的就是如何去掉知识库,其余的我都能做到D 更新:我不觉得这是与建议的另一个问题的重复,因为我正在寻找此线程中给出的纯SQL解决方案。我的第一个想法是只存储在变量中,然后使用子字符串删除最后的字符 -- Setup DECLARE @data VARCHAR(50) SET @data = '159736 KB' -- Computati

我使用函数sp_space来获取数据库中所有表的详细信息。index_size列返回的是VARCHAR,末尾带有“KB”,但我希望以MB为单位显示。我所需要知道的就是如何去掉知识库,其余的我都能做到D


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

我的第一个想法是只存储在变量中,然后使用子字符串删除最后的字符

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

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

-- Conversion
SELECT CAST(@data AS INTEGER)
替换(列“KB”和“”。不需要LEN和其他东西

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

更多的调查应该允许您从catlog视图中读取索引和数据空间

更通用的解决方案:

-- 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
——测试数据
声明@StrIn VARCHAR(100)、@StrOut VARCHAR(100)、@I INT、@Len INT
选择@StrIn='123m43 5m409',@StrOut='',@I=0,@Len=Len(@StrIn)
--答复
当(@I<@Len)开始时
选择@I=@I+1,
@StrOut=@StrOut+
案例
当(在47和58之间转换(ASCII(子字符串(@StrIn,@I,1))为INT)
然后子字符串(@StrIn,@I,1)ELSE“
结束
结束
选择@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;
这可以很容易地封装到标量函数中。一个完全通用的函数将接受允许的字符列表,或者您可以为特殊目的(如此)硬编码。

可能的重复:
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;