none
Comando bulk passando parâmetro - Erro na inserção utilizando FILESTREAM RRS feed

  • Pergunta

  • Preciso fazer uma consulta para carregar várias imagens e armazená-las no banco utilizando FILESTREAM. Só que preciso fazer isso utilizando parâmetros, pois o caminho das imagens não será sempre igual.

    Fiz um teste executando a consulta a seguir:

    DECLARE
    @FilesTream varbinary(max),

    @texto varchar(max)

    set @texto = 'C:\Documents\000001.jpg'

    set @FilesTream = CAST('(select * from openrowset(BULK ''' + @texto + ''', SINGLE_BLOB) as Arquivo)'AS VARBINARY(MAX))

    INSERT INTO testeimagem (guid_imagem,imagem)
    values (NEWID(),@FilesTream)

    A consulta inseriu os dados na tabela e gerou o arquivo no FILEGROUP utilizado para FILESTREAM; porém, o arquivo foi gerado com erro (tamanho de 1 KB, quando deveria ser de 20 KB, que é o tamanho de imagem).

    Quando faço a mesma consulta colocando o caminho em vez do parâmetro o BULK funciona normalmente, gerando o arquivo no FILEGROUP com o tamanho correto.

    Vocês saberiam me dizer qual é a sintaxe correta para realizar o BULK passando um parâmetro nesta situação?

    • Movido Roberson Ferreira _ sexta-feira, 14 de setembro de 2012 11:32 (De:SQL Server - Desenvolvimento Geral)
    quinta-feira, 8 de março de 2012 18:08

Todas as Respostas

  • Você pode jogar tudo isso em uma procedure e ai sim passar o parâmetro.

    Exemplo da uma procedure que uso BULK e passo parâmetro

    CREATE PROCEDURE P_IMPORTATXT(@TABELA VARCHAR(50), @DIR VARCHAR(100), @ARQUIVO VARCHAR(500), @SEPARADOR VARCHAR(1))
    AS
    DECLARE @EXECSTR NVARCHAR(MAX);
    DECLARE @CMD VARCHAR(1000);
    BEGIN
        SET  @EXECSTR = 'BULK INSERT ' +  @TABELA + ' FROM  ' + '''' + @DIR + @ARQUIVO + '''' +
    	' WITH
    	(
    		FIELDTERMINATOR = ' + '''' + @SEPARADOR + '''' + ',  
    		ROWTERMINATOR = ''\n'' 
    	) '
    	
    	--PRINT @EXECSTR;
    	EXEC SP_EXECUTESQL @EXECSTR;
    	
    	SELECT @CMD = 'DEL ' + @DIR + @ARQUIVO + ' /Q';
    	
    	PRINT @CMD;
    	
    	EXEC xp_cmdshell @CMD;
    
    END

    .

    • Sugerido como Resposta Ruberlei quinta-feira, 4 de outubro de 2012 01:40
    quinta-feira, 4 de outubro de 2012 01:36