Usuário com melhor resposta
Consulta Substring

Pergunta
-
Pessoal, preciso fazer uma consulta que me retorne parte de um campo.
........<dhRecbto>2012-05-21T09:31:24</dhRecbto>......
Preciso retornar a data e o horário desse texto, porém não existe nenhuma forma de verificar quantos caracteres tem antes, porque é variável, somente as tags iniciais e finais (<dhRecbto> e </dhRecbto> ). Tem como fazer isso ?
Desde já agradeço.
Gregorio
Respostas
-
Gregorio, boa tarde,
Sabemos que a posição inicial é o próximo caractere após a tag "<dhRecbto>", também sabemos que o tamanho da data e o horário é 19 posições.
Segue um exemplo:
CREATE TABLE #Teste( Texto VARCHAR(100)) INSERT INTO #Teste (Texto) VALUES ('.......<dhRecbto>2012-05-21T09:31:24</dhRecbto>......'), ('...........<dhRecbto>2012-05-21T09:31:24</dhRecbto>.........'), ('....<dhRecbto>2012-05-21T09:31:24</dhRecbto>.........') SELECT SUBSTRING(Texto,CHARINDEX('<dhRecbto>',Texto)+LEN('<dhRecbto>'),19) FROM #Teste
A função CHARINDEX pesquisa uma expressão e retorna sua posição inicial, se for localizada.
Att,
Rafael Godoi Sabadin
http://www.linkedin.com/in/rafaelgodoisabadin
Classifique as respostas. O seu feedback é essencial.- Marcado como Resposta Gregorio Venturim terça-feira, 22 de maio de 2012 19:53
-
declare @text varchar(8000), @InicialString as int, @finalString as int set @InicialString = LEN('<dhRecbto>') set @finalString = LEN('/<dhRecbto>') set @text = '..234823948239fsdfjdske3409......<dhRecbto>2012-05-21T09:31:24</dhRecbto>...vfdghjr0938dwefsdhfjkds...' select SUBSTRING( @text,charindex('<dhRecbto>' ,@text)+@InicialString, (LEN(@text)- CHARINDEX('</dhRecbto>',@text)-@InicialString - @finalString)+1 )
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
- Marcado como Resposta Gregorio Venturim terça-feira, 22 de maio de 2012 19:53
Todas as Respostas
-
Gregorio, boa tarde,
Sabemos que a posição inicial é o próximo caractere após a tag "<dhRecbto>", também sabemos que o tamanho da data e o horário é 19 posições.
Segue um exemplo:
CREATE TABLE #Teste( Texto VARCHAR(100)) INSERT INTO #Teste (Texto) VALUES ('.......<dhRecbto>2012-05-21T09:31:24</dhRecbto>......'), ('...........<dhRecbto>2012-05-21T09:31:24</dhRecbto>.........'), ('....<dhRecbto>2012-05-21T09:31:24</dhRecbto>.........') SELECT SUBSTRING(Texto,CHARINDEX('<dhRecbto>',Texto)+LEN('<dhRecbto>'),19) FROM #Teste
A função CHARINDEX pesquisa uma expressão e retorna sua posição inicial, se for localizada.
Att,
Rafael Godoi Sabadin
http://www.linkedin.com/in/rafaelgodoisabadin
Classifique as respostas. O seu feedback é essencial.- Marcado como Resposta Gregorio Venturim terça-feira, 22 de maio de 2012 19:53
-
declare @text varchar(8000), @InicialString as int, @finalString as int set @InicialString = LEN('<dhRecbto>') set @finalString = LEN('/<dhRecbto>') set @text = '..234823948239fsdfjdske3409......<dhRecbto>2012-05-21T09:31:24</dhRecbto>...vfdghjr0938dwefsdhfjkds...' select SUBSTRING( @text,charindex('<dhRecbto>' ,@text)+@InicialString, (LEN(@text)- CHARINDEX('</dhRecbto>',@text)-@InicialString - @finalString)+1 )
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
- Marcado como Resposta Gregorio Venturim terça-feira, 22 de maio de 2012 19:53
-
Gregorio,
Se isso é um XML é melhor você trabalhar com as ferramentas de XML do SQL Server...
Veja um exemplo retirado do Books Online:
DECLARE @idoc int DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customers CustomerID="VINET" ContactName="Paul Henriot"> <Orders CustomerID="VINET" EmployeeID="5" OrderDate= "1996-07-04T00:00:00"> <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/> <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/> </Orders> </Customers> <Customers CustomerID="LILAS" ContactName="Carlos Gonzlez"> <Orders CustomerID="LILAS" EmployeeID="3" OrderDate= "1996-08-16T00:00:00"> <Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/> </Orders> </Customers> </ROOT>' --Create an internal representation of the XML document. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc -- SELECT statement that uses the OPENXML rowset provider. SELECT * FROM OPENXML (@idoc, '/ROOT/Customers') EXEC sp_xml_removedocument @idoc
Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008
- Sugerido como Resposta Rafael Godoi Sabadin segunda-feira, 21 de maio de 2012 20:50