Usuário com melhor resposta
Insert Into com Delimitador

Pergunta
-
Olá pessoa,
Eu tenho uma Tabela A que possui dados delimitados por ponto e virgula:
DADOS
João; Vendedor; 1.200,00; 01/01/2012
Renata; Supervisora; 3.000,00; 04/02/2014
Eu quer importar esse dados Para Outra Tabela
FUNCIONÁRIOS
NOME | FUNÇÃO | SALÁRIO | DATA ADMISSÃO
Conforme o delimitador.
Alguém conhece alguma maneira que tenha um menor custo computacional?
Eu já fiz através de XML e usando substring, mas a tabela tem muitos dados e passa dias convertendo.
Respostas
-
Deleted
- Sugerido como Resposta André Renato Furtado domingo, 1 de abril de 2018 17:36
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 2 de abril de 2018 17:06
Todas as Respostas
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 20 de março de 2018 23:13
-
Bom dia!
Isso pode ser simples. Você pode criar a função a seguir e depois disso no seu insert criar um laço separando as colunas pelo seu delimitador. é só implementar o exemplo.
CREATE FUNCTION dbo.UFN_SEPARATES_COLUMNS( @TEXT varchar(8000) ,@COLUMN tinyint ,@SEPARATOR char(1) )RETURNS varchar(8000) AS BEGIN DECLARE @POS_START int = 1 DECLARE @POS_END int = CHARINDEX(@SEPARATOR, @TEXT, @POS_START) WHILE (@COLUMN >1 AND @POS_END> 0) BEGIN SET @POS_START = @POS_END + 1 SET @POS_END = CHARINDEX(@SEPARATOR, @TEXT, @POS_START) SET @COLUMN = @COLUMN - 1 END IF @COLUMN > 1 SET @POS_START = LEN(@TEXT) + 1 IF @POS_END = 0 SET @POS_END = LEN(@TEXT) + 1 RETURN SUBSTRING (@TEXT, @POS_START, @POS_END - @POS_START) END GO
INSERINDO:
DECLARE @STR AS VARCHAR(500)
SET @STR = 'João; Vendedor; 1.200,00; 01/01/2012'
SELECT dbo.UFN_SEPARATES_COLUMNS(@STR,1,';') AS NOME,dbo.UFN_SEPARATES_COLUMNS(@STR,2,';') AS FUNCAO,dbo.UFN_SEPARATES_COLUMNS(@STR,3,';') AS SALARIO,dbo.UFN_SEPARATES_COLUMNS(@STR,4,';') AS DT_ADMISSAO- Sugerido como Resposta Lucio Rogerio SPBanned segunda-feira, 19 de março de 2018 15:58
-
Deleted
- Marcado como Resposta Filipe B CastroModerator quarta-feira, 21 de março de 2018 17:55
-
Com XML eu faço dessa forma, mas como falei é muito custoso.
INSERT INTO FUNCIONARIOS(NOME,FUNCAO,SALARIO,DT_ ADM)
SELECT
LTRIM(RTRIM(NOME.ColXML.value('@Ind','varchar(28)'))) AS NOME,LTRIM(RTRIM(FUNCAO.ColXML.value('@Ind','varchar(28)'))) AS FUNCAO,
CAST(REPLACE(LTRIM(RTRIM(SALARIO.ColXML.value('@Ind','varchar(max)'))),',','.') AS FLOAT) AS SALARIO,
CONVERT(DATETIME ,stuff(stuff(LTRIM(RTRIM(DT_ADM.ColXML.value('@Ind','varchar(8)'))),5,0,'/'),3,0,'/'),103)AS DT_ADM
FROM (SELECT
CONVERT(XML, '<Test Ind="' + Replace(ITEM, '|','"/><Test Ind="') + '"/>')AS ITEM
FROM #EMPRESA_A) AS EMPRESA_A_XMLOUTER APPLY EMPRESA_A_XML.ITEM.nodes('/Test[1]') AS NOME(ColXML)
OUTER APPLY EMPRESA_A_XML.ITEM.nodes('/Test[2]') AS FUNCAO(ColXML)
OUTER APPLY EMPRESA_A_XML.ITEM.nodes('/Test[3]') SALARIO(ColXML)
OUTER APPLY EMPRESA_A_XML.ITEM.nodes('/Test[4]') AS DT_ ADM(ColXML)
-
-
Deleted
- Sugerido como Resposta André Renato Furtado domingo, 1 de abril de 2018 17:36
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 2 de abril de 2018 17:06