首页 > 解决方案 > 如何将多个 varchar 值转换为 smallint

问题描述

对不起,我一直在努力寻找答案,但论坛中的大多数问题都与转换一个值有关,而不是整个集合。

我正在尝试将子查询值传递给主查询,但子查询返回varchar并且主查询列正在接受smallint。我尝试了投射和转换,但没有帮助我。

select time_off_type_no 
from schedtime 
where activity_no in (select AT_NUMBERS from ACTIVITY where AT_ID = 105)

此查询引发以下异常

将 varchar 值 '483,484,485,486,487,488,489' 转换为数据类型 smallint 时转换失败

任何关于如何转换值的建议都非常感谢。

以下查询返回“483,484,485,486,487,488,489”,我想将所有值转换为SmallIntint将其传递给主查询。

select AT_NUMBERS 
from ACTIVITY 
where AT_ID = 105

标签: sqlsql-server

解决方案


请尝试嵌套铸造,如:

SELECT CAST(CAST(AT_NUMBERS AS DECIMAL) AS SMALLINT) from ACTIVITY where AT_ID=105

编辑:由于返回值是逗号分隔的字符串,我认为如果 SQL Server 的版本至少为 2016,这将有所帮助

;with cte (ID) as (
  Select string_split (AT_NUMBERS,',') as ID
  from ACTIVITY
  where AT_ID=105
)
select time_off_type_no from schedtime where activity_no in (
   SELECT CAST(CAST(ID AS DECIMAL) AS SMALLINT) from cte
)

如果 SQL SERVER 版本低于 2016,我们需要开发自己的拆分功能。您可以在How to split a comma-separated value to columns中找到示例

如果是这样,请尝试以下示例,在 Sql Server 2008 中工作:

DECLARE @t TABLE
(
EmployeeID INT,
Certs VARCHAR(8000)
)
INSERT @t VALUES (1,'B.E.,MCA, MCDBA, PGDCA'), (2,'M.Com.,B.Sc.'), (3,'M.Sc.,M.Tech.')


SELECT EmployeeID,
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs
FROM
(
SELECT EmployeeID,CAST('<XMLRoot><RowData>' + REPLACE(Certs,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM   @t
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)

参考:https ://blog.sqlauthority.com/2015/04/21/sql-server-split-comma-separated-list-without-using-a-function/


推荐阅读