对不起,我一直在努力寻找答案,但是大多数问题与论坛中与转换一个值而不是整个值有关。
我试图将子查询值传递给主查询,但是子查询返回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',我想将所有值转换为SmallInt
或int
,以将其传递给主查询。
select AT_NUMBERS
from ACTIVITY
where AT_ID = 105
答案 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)
答案 1 :(得分:1)
如果这些(483,484,485,486,487,487,488,489)是单个数字,我认为您需要用逗号分隔字符串。如果这是整个整数值,那么甚至没有Big Int限制。
请参阅MS文档:
如果您的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,则可能必须构建一个字符串拆分函数,如此处所述。