none
Insert com select em campo Binary RRS feed

  • Pergunta

  • Olá a todos!

    Tenho o seguinte ambiente

    CREATE TABLE [dbo].[Usuario_Digital](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Usuario] [int] NULL,
    	[Digital] [binary](1500) NULL
    ) ON [PRIMARY]


    CREATE TABLE [dbo].[Usuario_Digital_Bkp](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Usuario] [int] NULL,
    	[Digital] [binary](1500) NULL
    ) ON [PRIMARY]

    Estou tentando executar o seguinte comando na base, para gerar um backup dos registros:

    INSERT INTO Usuario_Digital_Bkp SELECT Usuario,Digital FROM Usuario_Digital

    Mas o SQL me mostra o seguinte erro:

    Msg 8152, Level 16, State 11, Line 1
    String or binary data would be truncated.
    The statement has been terminated.

    Como faço para resolver esse problema? Agradeço desde já!

    terça-feira, 28 de outubro de 2014 13:16

Respostas

  • Provavelmente o tamanho da digital é maior do que declarado e vai truncar devido a isso, aumente o tamanho do campo que resolve
    • Sugerido como Resposta Mr. GMSOFT terça-feira, 28 de outubro de 2014 13:24
    • Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 29 de outubro de 2014 17:44
    terça-feira, 28 de outubro de 2014 13:23
  • Já tentou assim?

    SELECT Usuario,Digital
    INTO Usuario_Digital_Bkp
    FROM Usuario_Digital

    terça-feira, 28 de outubro de 2014 13:27
  • Thiago,

    Se você pretende ter uma tabela de backup, não é necessário adicionar a propriedade IDENTITY na coluna "Id" no seu backup.

    Outro ponto importante à observar é que você poderá ter problemas de "quebra" de conteúdo como está no erro que você indicou ao manipular arquivos ou imagens. O ideal é utilizar o datatype "varbinary" com alocação MAX para utilizar apenas o espaço necessário, mas sem um limite pequeno como você está especificando.

    Segue abaixo um script T-SQL adaptado com suas tabelas. Faça os ajustes necessários, como você precisa:

    CREATE TABLE [dbo].[Usuario_Digital](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Usuario] [int] NULL,
    	[Digital] [varbinary](MAX) NULL  --USANDO O DATATYPE "varbinary"
    ) ON [PRIMARY]
    
    CREATE TABLE [dbo].[Usuario_Digital_Bkp](
    	[Id] [int] NOT NULL,  -- SEM A PROPRIEDADE "IDENTITY"
    	[Usuario] [int] NULL,
    	[Digital] [varbinary](MAX) NULL
    ) ON [PRIMARY]
    GO
    
    --Inserindo um registro de exemplo INSERT INTO Usuario_Digital(Usuario, Digital) SELECT 123, * FROM OPENROWSET(BULK N'C:\util\avatar.jpg', SINGLE_BLOB) AS Imagem; GO
    --Inserindo os dados de uma tabela para outra (declarando suas colunas) INSERT INTO Usuario_Digital_Bkp (Id, Usuario, Digital) SELECT Id, Usuario, Digital FROM Usuario_Digital GO

    Para maiores informações veja este artigo:

    http://social.technet.microsoft.com/wiki/pt-br/contents/articles/25056.manipulando-imagens-atraves-de-t-sql.aspx


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 28 de outubro de 2014 13:36
    Moderador

Todas as Respostas

  • Provavelmente o tamanho da digital é maior do que declarado e vai truncar devido a isso, aumente o tamanho do campo que resolve
    • Sugerido como Resposta Mr. GMSOFT terça-feira, 28 de outubro de 2014 13:24
    • Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 29 de outubro de 2014 17:44
    terça-feira, 28 de outubro de 2014 13:23
  • Já tentou assim?

    SELECT Usuario,Digital
    INTO Usuario_Digital_Bkp
    FROM Usuario_Digital

    terça-feira, 28 de outubro de 2014 13:27
  • Thiago,

    Se você pretende ter uma tabela de backup, não é necessário adicionar a propriedade IDENTITY na coluna "Id" no seu backup.

    Outro ponto importante à observar é que você poderá ter problemas de "quebra" de conteúdo como está no erro que você indicou ao manipular arquivos ou imagens. O ideal é utilizar o datatype "varbinary" com alocação MAX para utilizar apenas o espaço necessário, mas sem um limite pequeno como você está especificando.

    Segue abaixo um script T-SQL adaptado com suas tabelas. Faça os ajustes necessários, como você precisa:

    CREATE TABLE [dbo].[Usuario_Digital](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Usuario] [int] NULL,
    	[Digital] [varbinary](MAX) NULL  --USANDO O DATATYPE "varbinary"
    ) ON [PRIMARY]
    
    CREATE TABLE [dbo].[Usuario_Digital_Bkp](
    	[Id] [int] NOT NULL,  -- SEM A PROPRIEDADE "IDENTITY"
    	[Usuario] [int] NULL,
    	[Digital] [varbinary](MAX) NULL
    ) ON [PRIMARY]
    GO
    
    --Inserindo um registro de exemplo INSERT INTO Usuario_Digital(Usuario, Digital) SELECT 123, * FROM OPENROWSET(BULK N'C:\util\avatar.jpg', SINGLE_BLOB) AS Imagem; GO
    --Inserindo os dados de uma tabela para outra (declarando suas colunas) INSERT INTO Usuario_Digital_Bkp (Id, Usuario, Digital) SELECT Id, Usuario, Digital FROM Usuario_Digital GO

    Para maiores informações veja este artigo:

    http://social.technet.microsoft.com/wiki/pt-br/contents/articles/25056.manipulando-imagens-atraves-de-t-sql.aspx


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 28 de outubro de 2014 13:36
    Moderador