SQL Server - División de cadena

 
Vista:
sin imagen de perfil

División de cadena

Publicado por División de cadena (4 intervenciones) el 13/04/2021 21:38:10
Que tal

Tengo un archivo que contiene un listado de rutas donde se encuentran ciertos archivos

declare @cadena varchar(100) = '\\nas\ANEXOS_ARTICULOS\COC\EQ_ACC\EQUIPOS\HORNOS\SMEG\17227906-SF7390X-MUSR1.pdf'

Lo que deseo realizar es la separación de la cadena para obtener
--RUTA
--Nombre del archivo
--Codigo = 17227906 (en este caso)
--Tipo de archivo

Este es mi código, pero es muy repetitivo, considero que lo optimo seria agregar un ciclo
Al igual ahorita si la cadena crece, este código manda un error

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
declare @cadena varchar(100) = '\\nas\ANEXOS_ARTICULOS\COC\EQ_ACC\EQUIPOS\HORNOS\SMEG\17227906-SF7390X-MUSR1.pdf'
declare @Ruta varchar(100)
declare @V1 varchar(100)
declare @V2 varchar(100)
declare @C1 varchar(100)
declare @C2 varchar(100)
declare @C3 varchar(100)
declare @C4 varchar(100)
declare @C5 varchar(100)
declare @C6 varchar(100)
declare @C7 varchar(100)
declare @C8 varchar(100)
declare @C9 varchar(100)
declare @C10 varchar(100)
declare @C11 varchar(100)
 
SELECT @Ruta=@cadena
SELECT @V1 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
PRINT @CADENA
 
SELECT @V2 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
PRINT @CADENA
 
SELECT @C1 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
PRINT @CADENA
 
SELECT @C2 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
 
SELECT @C3 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
 
SELECT @C4 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
 
SELECT @C5 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
 
SELECT @C6 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
 
SELECT @C7 = SUBSTRING(@cadena, 1, CHARINDEX('\', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('\', @cadena) + 1), LEN(@cadena))
 
SELECT @C8 = SUBSTRING(@cadena, 1, CHARINDEX('-', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('-', @cadena) + 1), LEN(@cadena))
 
SELECT @C9 = SUBSTRING(@cadena, 1, CHARINDEX('-', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('-', @cadena) + 1), LEN(@cadena))
 
SELECT @C10 = SUBSTRING(@cadena, 1, CHARINDEX('.', @cadena) - 1)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('.', @cadena) + 1), LEN(@cadena))
 
SELECT @C11 = SUBSTRING(@cadena, 1, CHARINDEX('.', @cadena) + 3)
SET @cadena = SUBSTRING(@cadena,(CHARINDEX('.', @cadena) - 1), LEN(@cadena))
 
SELECT @Ruta AS RUTA
 ,@V1 AS VACIO1
, @V2 AS VACIO2
, @C1 AS CARPETA1
, @C2 AS CARPETA2
, @C3 AS CARPETA3
, @C4 AS CARPETA4
, @C5 AS CARPETA5
, @C6 AS CARPETA6
, @C7 AS CARPETA7
, @C8 AS CARPETA8
, @C9 AS CARPETA9
, @C10 AS CARPETA10
, @C11 AS CARPETA11
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Plutarco
Val: 122
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

División de cadena

Publicado por Plutarco (46 intervenciones) el 19/04/2021 20:19:04
Hola, yo haría lo siguiente:

Primero lo vería de atrás hacia adelante, es decir, encontrando la primer diagonal (\) en realidad encontraría la última, como charindex() no puede buscar de adelante hacia atrás, entonces hago un while que recorra mi cadena de derecha a izquierda, una vez que encuentre la última diagonal entonces en automático tengo la ruta y el nombre del archivo, y lo demás ya es fácil.

DECLARE
@cadena varchar(100),
@Char VARCHAR(1),
@Longi INT,
@Conta INT,
@Archivo VARCHAR(50),
@Ruta VARCHAR(100),
@Codigo VARCHAR(50),
@Tipo VARCHAR(10)

SET @cadena = '\\nas\ANEXOS_ARTICULOS\COC\EQ_ACC\EQUIPOS\HORNOS\SMEG\17227906-SF7390X-MUSR1.pdf'

SET @Longi = LEN(LTRIM(RTRIM(@cadena)))
SET @Conta = 1

WHILE @Conta <= @Longi
BEGIN
SET @Char = SUBSTRING(@cadena, @Longi - @Conta, 1)

IF @Char = '\'
BEGIN
SET @Archivo = SUBSTRING(@cadena, @Longi - @Conta + 1, @Conta + 1)
SET @Ruta = SUBSTRING(@cadena, 1, @Longi - @Conta - 1)
SET @Conta = @Longi
END

SET @Conta = @Conta + 1
END

SET @Codigo = SUBSTRING(@Archivo, 1, CHARINDEX('-', @Archivo) - 1)
SET @Tipo = SUBSTRING(@Archivo, CHARINDEX('.', @Archivo) + 1, LEN(@Archivo) - CHARINDEX('.', @Archivo))

SELECT @Ruta, @Archivo, @Codigo, @Tipo


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

División de cadena

Publicado por Karen (4 intervenciones) el 06/12/2021 15:34:33
Una disculpa por la tardanza, me funciono muy bien con el while, le agregue algunas otras cosas que ocupaba.

Gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar