如何将多个varchar值转换为smallint

时间:2018-11-11 18:14:16

标签: sql sql-server

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

我试图将子查询值传递给主查询,但是子查询返回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,487,488,489'转换为数据类型smallint时转换失败

有关如何转换值的任何建议,深表感谢。

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

select AT_NUMBERS 
from ACTIVITY 
where AT_ID = 105

2 个答案:

答案 0 :(得分:1)

请尝试嵌套嵌套铸造,例如:

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,则需要开发自己的split函数。您可以在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/

答案 1 :(得分:1)

如果这些(483,484,485,486,487,487,488,489)是单个数字,我认为您需要用逗号分隔字符串。如果这是整个整数值,那么甚至没有Big Int限制。

请参阅MS文档:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql?view=sql-server-2017

如果您的SQL Server版本大于2016或更高版本,则可以通过这种方式使用string_split函数。

-使用try_cast或Try_convert还可避免任何转换错误。

select Try_cast(value as int) Integervalue  from  string_split ('483,484,485,486,487,488,489',',') 

输出:

Integervalue
483
484
485
486
487
488
489

-如果它是纯整数值,它将起作用,否则需要将其转换为十进制。

如果要针对表格使用,请确保使用交叉应用。

如果小于2016,则可能必须构建一个字符串拆分函数,如此处所述。

Splitting the string in sql server