Tsql 保存子字符串';从交叉应用到变量

Tsql 保存子字符串';从交叉应用到变量,tsql,sql-server-2012,ssms,delimited-text,cross-apply,Tsql,Sql Server 2012,Ssms,Delimited Text,Cross Apply,我需要通过抓取12 x 18将返回“12 x 18 x 18 in”的列转换为3个不同的列 我需要将这些数据存储到变量中,以便进一步进行插入,因为这是一个大型存储过程的一部分,用于将数据从一个DB转换到另一个DB 使用前面问题中的一个示例,我创建了以下内容: DECLARE @HeightT VARCHAR(10), @LengthT VARCHAR(10), @WidthT VARCHAR(10) S

我需要通过抓取12 x 18将返回“12 x 18 x 18 in”的列转换为3个不同的列

我需要将这些数据存储到变量中,以便进一步进行插入,因为这是一个大型存储过程的一部分,用于将数据从一个DB转换到另一个DB

使用前面问题中的一个示例,我创建了以下内容:

        DECLARE     
        @HeightT VARCHAR(10),
        @LengthT VARCHAR(10),
        @WidthT VARCHAR(10)


        SELECT TOP 1 ParsedData.* 
        FROM DB.dbo.Table sh
        CROSS apply ( select str = sh.Dimensions + 'xxx in' ) f1
        CROSS apply ( select p1 = charindex( 'x', str ) ) ap1
        CROSS apply ( select p2 = charindex( 'x', str, p1 + 1 ) ) ap2
        CROSS apply ( select p3 = charindex( 'x', str, p2 + 1 ) ) ap3
        CROSS apply ( select substring( str, 1, p1-1 )   Height               
             ,   substring( str, p1+1, p2-p1-1 ) Length
             ,   substring ( str, p2+1, p3 -p2 - 3) Width
             WHERE ID = '1111111'

         ) 
         ParsedData
-从

是否可以获取高度、长度和宽度来存储到这些变量中,以便我可以在存储过程的稍后插入中使用它们

*请注意,这只适用于选择解析的值,但这不是我需要的。交叉申请是给我带来困难的部分。 答复:

根据Ti的建议,我提出了以下建议:

DECLARE @tbl TABLE (col VARCHAR(255))
INSERT INTO @tbl (col)
SELECT Dimensions
FROM DB.dbo.Table
WHERE ID = '1111111'

DECLARE @Height INT, @Length INT, @Width INT, @Temp varchar(5)

SELECT TOP 1
@Height = CAST(LEFT(col, CHARINDEX('x', col)-1) AS int),
@Length  = CAST(SUBSTRING(col, CHARINDEX('x', col)+1, CHARINDEX('x', REVERSE(col))-CHARINDEX('x', col)) AS int),
@Temp  = CAST(REVERSE(LEFT(REVERSE(col), CHARINDEX('x', REVERSE(col))-2)) AS VARCHAR(8)) 
FROM @tbl

SET  @Width = SUBSTRING(@Temp,1,(CHARINDEX(' ',@Temp + ' ')-1) )

SELECT Height = @height, Length = @Length, Width = @Width

这可以在不交叉应用的情况下完成

DECLARE @tbl TABLE (col VARCHAR(255))
INSERT INTO @tbl (col)
VALUES ('18 x 18 x 12')

DECLARE @height INT, @width INT, @depth INT

SELECT TOP 1
    @height = CAST(LEFT(col, CHARINDEX('x', col)-1) AS int),
    @width  = CAST(LEFT(STUFF(col, 1, CHARINDEX('x', col)+1, ''), CHARINDEX('x', STUFF(col, 1, CHARINDEX('x', col)+1, ''))-1) AS int),
    @depth  = CAST(REVERSE(LEFT(REVERSE(col), CHARINDEX('x', REVERSE(col))-1)) AS int) 
FROM @tbl

SELECT height = @height, width = @width, depth = @depth

非常感谢。我想我可能得走临时桌的路线。我感谢你的帮助。你的回答恰到好处。我只需要做另一个temp变量来保存'18in'部分,并将其子串成一个18,这样就可以将其存储为int。