将char转换为smallint SQL

时间:2018-01-05 19:27:06

标签: sql-server

我在SQL Server表中有一个名为Motive list_a的列声明为Book_pagenumber。当我尝试使用如下所示的insert语句时,其中一个页面包含数字和字母,如50a

smallint

我收到错误消息

  

将varchar值转换为数据类型smallint时转换失败

我也用过

insert into [Books] (book_id, book_author, Book_pagenumber) 
values (50, 'Test', cast('50a' as smallint))

我已插入数据,但只有50号而没有这封信。

我需要建议如何在不改变列数据类型的情况下将char转换为smallint

2 个答案:

答案 0 :(得分:4)

一个选项可能是

示例

Declare @YourTable table (Book_pagenumber varchar(50))
Insert Into @YourTable values
('50a'),
('123b'),
('175')

Select *
      ,AsInt = try_convert(int,left(Book_pagenumber,patindex('%[^0-9]%',Book_pagenumber+'a')-1))
 From  @YourTable

<强>返回

Book_pagenumber AsInt
50a            50
123b           123
175            175

答案 1 :(得分:0)

您可以创建一个函数来清除字符串,而不是数字:

-- Create Function that will keep only numeric values in @String
CREATE FUNCTION dbo.udf_NumericOnly (@String NVARCHAR(64))
RETURNS SMALLINT
AS
BEGIN
    DECLARE
        @Result VARCHAR(5) = N''
        , @Position INT = 1
        , @Length INT;

    SELECT @Length = LEN(@String);

    WHILE (@Position <= @Length)
    BEGIN
        SELECT @Result += CASE WHEN SUBSTRING(@String, @Position, 1) BETWEEN CHAR(48) AND CHAR(57) THEN SUBSTRING(@String, @Position, 1) ELSE N'' END;

        SELECT @Position += 1;
    END

    RETURN @Result;
END
GO

-- Test the Function
INSERT Books (book_id, book_authoer, Book_pagenumber)
SELECT
    50
    , 'Test'
    , dbo.udf_NumericOnly('a4s22df5');