将子串从Cross应用保存到变量中

时间:2015-12-22 20:17:17

标签: tsql sql-server-2012 ssms delimited-text cross-apply

我需要通过抓住12 18 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

- 来自How to split a comma-separated value to columns

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

*请注意,这只是选择解析后的值,但这不是我需要的。交叉应用是给我带来困难的部分。

答案:

使用T I的建议我做了这个:

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

1 个答案:

答案 0 :(得分:0)

这可以在不交叉申请的情况下完成。

var someobject = {
    makename(1)  : null,
    makename(2)  : null,
    makename(3)  : null,
    makename(4)  : null
};

function makename(num) {
    return (identifier + ' Bot' + num)
}