2009-09-02 19 views
10

Używam programu Microsoft SQL Server Management Studio do łączenia się z bazą danych. Mam w niej tabelę, której jedna kolumna jest kolumną obrazu zawierającą dane pliku. Inna kolumna to ciąg zawierający nazwę pliku.Jak wyeksportować pole obrazu do pliku?

Czy jest jakiś sposób, aby napisać skrypt SQL, który pozwoli mi wybrać rekord i zapisać te dane do pliku? A jeśli nie jest to możliwe, jaki jest prosty sposób na osiągnięcie tego?

Widziałem ten powiązane pytanie, ale nie wydaje się zupełnie ten sam: Save image column to file in sql-server 2000

Odpowiedz

25
-- Write all database images (jpg) to file. 
--------- --------- --------- --------- --------- --------- --------- 
DECLARE CURSOR_ProductIds CURSOR FOR (SELECT ImgImagesId FROM ImgProductSample) 

DECLARE @ProductId INT; 

OPEN CURSOR_ProductIds 

FETCH NEXT FROM CURSOR_ProductIds INTO @ProductId 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN 
    DECLARE @ImageData varbinary(max); 
    SELECT @ImageData = (SELECT convert(varbinary(max), ImageData, 1) FROM ProductImages WHERE Id = @ProductId); 

    DECLARE @Path nvarchar(1024); 
    SELECT @Path = 'C:\MyImages\Output'; 

    DECLARE @Filename NVARCHAR(1024); 
    SELECT @Filename = (SELECT ImageFilename FROM ProductImages WHERE id = @ProductId); 

    DECLARE @FullPathToOutputFile NVARCHAR(2048); 
    SELECT @FullPathToOutputFile = @Path + '\' + @Filename; 

    DECLARE @ObjectToken INT 
    EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT; 
    EXEC sp_OASetProperty @ObjectToken, 'Type', 1; 
    EXEC sp_OAMethod @ObjectToken, 'Open'; 
    EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @ImageData; 
    EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FullPathToOutputFile, 2; 
    EXEC sp_OAMethod @ObjectToken, 'Close'; 
    EXEC sp_OADestroy @ObjectToken; 

    FETCH NEXT FROM CURSOR_ProductIds INTO @ProductId 
END 
CLOSE CURSOR_ProductIds 
DEALLOCATE CURSOR_ProductIds 

-- Make sure the following statement is executed to enable file IO 
-- From http://msdn.microsoft.com/en-us/library/ms191188.aspx 
--------- --------- --------- --------- --------- --------- --------- 
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 
+0

Msg 8152, poziom 16, stan 10, wiersz 7 Łańcuch lub dane binarne byłyby obcięte. –

2
-- Write database image (jpg) to file 
-- http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=101754 
--------- --------- --------- --------- --------- --------- --------- 
DECLARE @ImageData varbinary(max); 
SELECT @ImageData = (SELECT convert(varbinary(max), ImageData, 1) FROM ProductImages WHERE Id = 1); 

DECLARE @Path nvarchar(1024); 
SELECT @Path = 'C:\MyImages\Output'; 

DECLARE @Filename NVARCHAR(1024); 
SELECT @Filename = (SELECT ImageFilename FROM ProductImages WHERE id = 1); 

DECLARE @FullPathToOutputFile NVARCHAR(2048); 
SELECT @FullPathToOutputFile = @Path + '\' + @Filename; 

DECLARE @ObjectToken INT 
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT; 
EXEC sp_OASetProperty @ObjectToken, 'Type', 1; 
EXEC sp_OAMethod @ObjectToken, 'Open'; 
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @ImageData; 
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FullPathToOutputFile, 2; 
EXEC sp_OAMethod @ObjectToken, 'Close'; 
EXEC sp_OADestroy @ObjectToken; 

-- Make sure the following statement is executed to enable file IO 
-- From http://msdn.microsoft.com/en-us/library/ms191188.aspx 
--------- --------- --------- --------- --------- --------- --------- 
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 

PS - link do artykułu „czytanie i pisanie pliki w SQL Server za pomocą T-SQL” było użyteczne, ale po tym, jak dostałem działający kod, powstał niepoprawny plik obrazu.

+0

@mathijusuitmegan Jestem stoi ten problem: Msg 8152, Level 16, State 10, Linia 7 String lub Dane binarne zostaną obcięte. –

5

Od mkader na codeproject:

EXEC sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
EXEC sp_configure 'xp_cmdshell',1 
GO 
RECONFIGURE; 
GO 

Następnie zrzucić plik formatu:

Declare @sql varchar(500) 
SET @sql = 'bcp DBName.dbo.tblTableName format nul -T -n -f C:\testblob.fmt -S ' + @@SERVERNAME 
select @sql 
EXEC master.dbo.xp_CmdShell @sql 

Mój plik formatu wyglądał tak:

10.0 
12 
1  SQLINT    0  4  "" 1  my_tablecol_id         "" 
2  SQLINT    1  4  "" 2  my_tablecol0         "" 
3  SQLCHAR    2  256  "" 3  my_tablecol1        SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR    2  256  "" 4  my_tablecol2        SQL_Latin1_General_CP1_CI_AS 
5  SQLCHAR    2  256  "" 5  my_tablecol3       SQL_Latin1_General_CP1_CI_AS 
6  SQLCHAR    2  2048 "" 6  my_tablecol4        SQL_Latin1_General_CP1_CI_AS 
7  SQLIMAGE   4  0  "" 7  my_imagecol          "" 
8  SQLCHAR    2  2048 "" 8  my_tablecol6       SQL_Latin1_General_CP1_CI_AS 
9  SQLINT    1  4  "" 9  my_tablecol7          "" 
10  SQLINT    1  4  "" 10 my_tablecol8         "" 
11  SQLINT    1  4  "" 11 my_tablecol9        "" 
12  SQLBIT    1  1  "" 12 my_tablecol10        "" 

I wtedy redagował formatuj plik tak:

10.0 
1 
1  SQLIMAGE   0  0  "" 1  my_imagecol          "" 

A potem prowadził tę SQL w SSMS:

Declare @mynum int 
Declare @sql varchar(500) 
SET @mynum = 49 -- something meaningful only to me 
SET @sql = 'BCP "SELECT my_imagecol FROM DBName.dbo.tblTableName where [email protected]" QUERYOUT C:\myfilename.docx -T -fC:\testblob.fmt -S ' + @@SERVERNAME 
EXEC master.dbo.xp_CmdShell @sql 

To działało bardzo dobrze, każdy rodzaj danych w kolumnie obrazu działa.

+0

Dzięki! Plik formatu był tym, czego potrzebowałem, aby to działało. –

0

Wiem, że jest to ponad 2-letnia nitka, nadal chciałem pisać, bo to mogłoby komuś pomóc. Jeśli chcemy eksportować obrazy wraz z innymi kolumnami (które zawierają symbole) z tabeli bazy danych do pliku, aby można je było zaimportować do innego serwera SQL, jest to bardzo przydatne.

Poniższy kod wyeksportuje określoną tabelę bazy danych do wybranej ścieżki pliku.

Declare @sql varchar(500) 
SET @sql = 'bcp Your_db.Your_table out Your_File_Path(eg: C:\ImagesNames.Dat) -w -T -S ' + @@SERVERNAME 
EXEC @sql 

Przełącznik -w jest dla pliku danych w formacie Unicode i separator będzie separator kartę domyślną, jeśli nie określić separator. W takim przypadku plik danych zostanie zapisany z rozszerzeniem dat. Być może można go zapisać również w innych formatach, ale nie przetestowałem go, podczas gdy ten działa idealnie.

https://msdn.microsoft.com/en-gb/library/ms188289(v=sql.110).aspx

Wtedy dla importu:

BULK INSERT Your_db.Your_table 
    FROM 'Your_File_Path' 
with (DATAFILETYPE='widechar') 

ten importuje plik danych bardzo skutecznie do określonej tabeli bazy danych.

-2

adaptowany rozwiązanie przez mathijsuitmegen i to działało idealnie dla mnie:

Code1

Code2

+0

Proponuję skopiować tekst zamiast obrazu. W przeciwnym razie nie jest przyjemnie czytać. – Carol

Powiązane problemy