Usuário com melhor resposta
Identificar coluna truncada

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"
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
- Sugerido como Resposta Junior Galvão - MVPMVP domingo, 22 de novembro de 2015 00:22
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. */ -
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" -
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]
-
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP domingo, 22 de novembro de 2015 00:22