我在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
答案 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');