none
Identificar coluna truncada RRS feed

  • Pergunta

  • Bom dia pessoal, 

    Já pesquisei nos foruns e sei que o SQL nativamente não tem esse recurso, mas preciso identificar qual coluna está gerando o erro de dados truncados na inserção !!! O SQL dá um erro muito genérico !

    Poderia usar o profile, mas mesmo assim eu precisaria simular inserindo informações !

    Alguém já fez alguma função ou algo do gênero ?


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 21 de outubro de 2015 11:59

Respostas

  • Flávio,

    veja se este post te ajuda.

    http://sqlblogcasts.com/blogs/danny/archive/2008/01/12/scuffling-with-string-or-binary-data-would-be-truncated.aspx


    Antero Marques

    terça-feira, 3 de novembro de 2015 20:21

Todas as Respostas

  • Bom dia Flávio,

    Eu nunca fiz nada do tipo, mas só o que eu consigo imaginar, seria uma trigger do tipo Instead Of. Mas ainda assim, teria o trabalho de conseguir comparar o tamanho máximo das colunas (max_length na syscolumns) com os valores que estão sendo inseridos.

    É uma ideia bacana, mas se for um caso muito específico, talvez o trabalho para desenvolver não compense.

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    quarta-feira, 21 de outubro de 2015 12:28
  • Pois é !!!
    Mesmo assim, eu teria que retornar o erro para a aplicação !!! E como o povo usa um framework aqui é outro problema !
    Além disso entendo que existe todo um processo anterior a inserção dos dados, ainda na fase de projeto, desenvolvimento e testes que podem evitar isso !!! 


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 21 de outubro de 2015 13:22
  • Flávio,

    Veja se este exemplo ajuda:

    CREATE TABLE tbl_sample
    (
     [ID] INT,
     [NAME] VARCHAR(10),
    )
    GO
    
    INSERT INTO tbl_sample VALUES (1,'Bob Jack Creasey')
    GO
    INSERT INTO tbl_sample ([ID],[NAME]) VALUES (2,'Frank Richard Wedge')
    GO
    
    
    CREATE PROCEDURE usp_String_or_binary_data_truncated
    @String VARCHAR(MAX)
    AS
     
    DECLARE @VARCHAR AS VARCHAR(MAX)
    DECLARE @Xml AS XML
    DECLARE @TCount AS INT
    SET @String= REPLACE(REPLACE(REPLACE(REPLACE(@String,'''','')
                 ,'[',''),']',''),CHAR(13) + CHAR(10),'')
    SET @Xml = CAST(('<a>'+REPLACE(@String,'(','</a><a>')
               +'</a>') AS XML)
     
    SELECT @TCount=COUNT(*)
    FROM @Xml.nodes('A') AS FN(A)
     
    ;WITH CTE AS
         (SELECT
         (CASE
         WHEN (CHARINDEX('INSERT INTO',A.value('.', 'varchar(max)'))>0)
         THEN 1
         WHEN CHARINDEX('VALUES',A.value('.', 'varchar(max)'))>0
         THEN 2
         WHEN (CHARINDEX('INSERT INTO',A.value('.', 'varchar(max)'))=0
         AND CHARINDEX('VALUES',A.value('.', 'varchar(max)'))=0)
         AND @TCount=2  THEN 2
         WHEN (CHARINDEX('INSERT INTO',A.value('.', 'varchar(max)'))=0
         AND CHARINDEX('VALUES',A.value('.', 'varchar(max)'))=0)
         AND @TCount=3  THEN 3
         END) AS[Batch Number],
         REPLACE(REPLACE(A.value('.', 'varchar(max)')
         ,'INSERT INTO',''),'VALUES ','') AS [Column]
         FROM @Xml.nodes('A') AS FN(A))
     
    , [CTE2] AS
    (
        SELECT
        [Batch Number],
        CAST('' + REPLACE([Column], ',' , '')
        + '' AS XML)
        AS [Column name And Data]
        FROM  [CTE]
    )
    ,[CTE3] AS
    (
        SELECT [Batch Number],
        ROW_NUMBER() OVER(PARTITION BY [Batch Number]
        ORDER BY [Batch Number] DESC) AS [Row Number],
        Split.a.value('.', 'VARCHAR(MAX)') AS [Column name And Data]
    FROM [CTE2]
    CROSS APPLY [Column name And Data].nodes('/M')Split(A))
     
    SELECT
     ISNULL(B.[Column name And Data],C.name) AS [Column Name]
    ,A.[Column name And Data] AS [Column Data]
    ,C.max_length As [Column Length]
    ,DATALENGTH(A.[Column name And Data])
    AS [Column Data Length]
     
    FROM [CTE3] A
    LEFT JOIN [CTE3] B
    ON A.[Batch Number]=2 AND B.[Batch Number]=3
    AND A.[Row Number] =B.[Row Number]
    LEFT JOIN sys.columns C
    ON C.object_id =(
        SELECT object_ID(LTRIM(RTRIM([Column name And Data])))
        FROM [CTE3] WHERE [Batch Number]=1
    )
    AND (C.name = B.[Column name And Data]
    OR  (C.column_id =A.[Row Number]
    And A.[Batch Number]<>1))
    WHERE a.[Batch Number] <>1
    AND DATALENGTH(A.[Column name And Data]) >C.max_length
    AND C.system_type_id IN (167,175,231,239)
    AND C.max_length>0
     
    GO
    
    EXEC usp_String_or_binary_data_truncated 'INSERT INTO tbl_sample VALUES (1,''Bob Jack Creasey'')'
    GO
    
    EXEC usp_String_or_binary_data_truncated 'INSERT INTO tbl_sample ([ID],[NAME]) VALUES (2,''Frank Richard Wedge'')'
    GO
    


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 22 de outubro de 2015 17:51
  • Retornou em branco.


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quinta-feira, 22 de outubro de 2015 18:29
  • Flávio,

    veja se este post te ajuda.

    http://sqlblogcasts.com/blogs/danny/archive/2008/01/12/scuffling-with-string-or-binary-data-would-be-truncated.aspx


    Antero Marques

    terça-feira, 3 de novembro de 2015 20:21