tsql从select中设置变量

时间:2013-12-11 20:42:34

标签: sql sql-server-2008 tsql

我有以下查询:

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语句不能与数据检索选项组合。

我该如何解决这个问题?

2 个答案:

答案 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或其他什么来修复那个部分。