我有以下查询:
declare @vlength varchar(50)
set @vLength =
(select
CASE
WHEN
SubString(SPSYS08.length, 0, CharIndex('"', SPSYS08.length)) > 0
AND SPSYS08.um = 'PC'
THEN SubString(SPSYS08.length, 0, CharIndex('"', SPSYS08.length)) / 12
else 1
end
From
SPSYS08 Inner Join
SPSYS07 On SPSYS08.loc_code = SPSYS07.loc_code And SPSYS08.so_no =
SPSYS07.so_no)
Select
SPSYS08.loc_code,
SPSYS08.so_no,
SPSYS08.line_no,
SPSYS07.invoice_date
From
SPSYS08 Inner Join
SPSYS07 On SPSYS08.loc_code = SPSYS07.loc_code And SPSYS08.so_no =
SPSYS07.so_no
Where
SPSYS07.invoice_date = '20131206'
我们正在SQL Server 2008上运行。我想要做的是将一个部分的长度分配给vLength变量。 Length是一个char,因为它包含英寸(“)符号。当将varchar值转换为int时,我或者转换失败,或者为变量赋值的select语句不能与数据检索选项组合。
我该如何解决这个问题?
答案 0 :(得分:0)
使用CTE代替:
;WITH Lengths AS
(select
Code,
'L' =
CASE
WHEN
SubString(SPSYS08.length, 0, CharIndex('"', SPSYS08.length)) > 0
AND SPSYS08.um = 'PC'
THEN SubString(SPSYS08.length, 0, CharIndex('"', SPSYS08.length)) / 12
else 1
end
From
SPSYS08 Inner Join
SPSYS07 On SPSYS08.loc_code = SPSYS07.loc_code And SPSYS08.so_no =
SPSYS07.so_no)
然后你可以
...
JOIN Lengths L
ON L.Code = SomeOtherTable.Code
...
并获取每条记录的长度。
答案 1 :(得分:0)
首先,这部分应该改变
THEN SubString(SPSYS08.length, 0, CharIndex('"', SPSYS08.length)) / 12
substring返回一个你试图用12表示的字符串,它将失败
你应该使用:
THEN CAST(SubString(SPSYS08.length, 0, CharIndex('"', SPSYS08.length)) AS INTEGER) / 12
但你应该确保你的子串返回一个可以转换为整数
的calue第二,你的select语句可能会返回多行,这会导致你的SET失败,所以你需要SELECT TOP 1
或其他什么来修复那个部分。