none
Insert Into com Delimitador RRS feed

  • 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. 

    domingo, 18 de março de 2018 20:49

Respostas

Todas as Respostas

  • Deleted
    domingo, 18 de março de 2018 22:22
  • 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

    segunda-feira, 19 de março de 2018 14:59
  • Deleted
    terça-feira, 20 de março de 2018 00:39
  • 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_XML

    OUTER 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)



    quarta-feira, 21 de março de 2018 01:48
  • Deleted
    quarta-feira, 21 de março de 2018 22:02
  • Deleted
    domingo, 25 de março de 2018 13:26