将交叉应用中的子字符串保存到变量中
Saving Substring's from a Cross Apply into A Variable
我需要通过抓取 12 18 18 将返回“12 x 18 x 18 in”的列转换为 3 个不同的列。
我需要将这些存储到变量中以便进一步向下插入,因为这是将数据从一个数据库转换到另一个数据库的大型存储过程的一部分。
使用上一个问题的示例,我创建了这个:
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
是否可以获取高度、长度和宽度以存储到这些变量中,以便稍后在存储过程中的插入中使用它们?
*请注意,只要选择解析后的值,这确实有效,但这不是我需要的。交叉应用是给我带来困难的部分。
答案:
根据我的建议,我做了这个:
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
我需要通过抓取 12 18 18 将返回“12 x 18 x 18 in”的列转换为 3 个不同的列。
我需要将这些存储到变量中以便进一步向下插入,因为这是将数据从一个数据库转换到另一个数据库的大型存储过程的一部分。
使用上一个问题的示例,我创建了这个:
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
是否可以获取高度、长度和宽度以存储到这些变量中,以便稍后在存储过程中的插入中使用它们?
*请注意,只要选择解析后的值,这确实有效,但这不是我需要的。交叉应用是给我带来困难的部分。
答案:
根据我的建议,我做了这个:
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