weltklasse
Goto Top

MS SQL-Server mit TSQL Bilddateien importieren

Ich habe eine Tabelle, in der in einem Feld ("Bildlink") ein Pfad zu einer Bild-JPG-Datei weggeschrieben ist.

Da die Tabelle mehrere 10.000 Datensätze enthält, benötige ich eine TSQL-Abfrage, mit der ich
die Bilder aus dem Pfad in ein Feld ("Bildimport") importieren kann.

So sieht die Tabelle aus:

CREATE TABLE [hsv].[dbo].[w_Bilddatei]
(Artikel_GUID uniqueidentifier null
,ArtikelNummer nvarchar(100) null
,Bildimport varbinary(max) null
,Bildlink nvarchar(100) null
) ON [PRIMARY];
GO

SELECT * FROM [hsv].[dbo].[w_Bilddatei]

Artikel_GUID ArtikelNummer Bildimport Bildlink
6EF40F0C-19B8-470D-AAB5-4B0C361B6F76 010379019 D:\Daten\Bilder\61313.jpg
5F4884D9-E0CA-4117-8C4F-F733C703DEA4 010379030 D:\Daten\Bilder\61329.jpg
FF1E3C05-72F8-4F91-BC5F-C87EA05BBB31 010379040 D:\Daten\Bilder\61478.jpg
752C4620-4FCB-4D66-8C99-9F1ED0E476BA 010379075 D:\Daten\Bilder\61617.jpg
A60786F9-6D5A-4630-B9C1-03AEECCEB31B 010825582 D:\Daten\Bilder\61101.jpg
E4D31FAE-FB9E-4767-8671-7CD16FA9506F 010825589 D:\Daten\Bilder\61009.jpg

Könnt Ihr mir mit einem Script helfen, wie ich die Bilddateien aus dem Pfad ("Bildlink") in das Feld "Bildimport" importieren kann.

Vielen für Eure Hilfe.

Content-ID: 42730335576

Url: https://administrator.de/contentid/42730335576

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

ukulele-7
ukulele-7 24.07.2024 aktualisiert um 08:59:21 Uhr
Goto Top
Also, der SQL Server Dienst soll die Datei vom Dateisystem lesen und in der Tabelle als VARBINARY speichern? Ich würde sagen das geht in diese Richtung:
https://stackoverflow.com/questions/1643627/how-to-insert-a-blob-into-a- ...

Du wirst vermutlich einen Cursor bauen müssen, ich glaube nicht, das es anders mit mehreren Dateien auf einmal geht. Bei der Menge würde man das auch nicht wollen.
weltklasse
weltklasse 24.07.2024 um 09:05:21 Uhr
Goto Top
Mit dem Befehl funktioniert der Import von einem Bild:

UPDATE [hsv].[dbo].[w_Bilddatei]

SET Bild = (SELECT BulkColumn FROM OPENROWSET (BULK 'D:\Daten\Bilder\61313.jpg', SINGLE_BLOB) AS x
WHERE Objekt = '6EF40F0C-19B8-470D-AAB5-4B0C361B6F76'

Die Frage ist, wie es automatisiert funktioniert, es sind mehrere 10.000 Datensätze???
ukulele-7
ukulele-7 24.07.2024 um 09:41:56 Uhr
Goto Top
Sry ich kann dir aus Zeitgründen nur einen guten Link geben:
https://www.mssqltips.com/sqlservertip/1599/cursor-in-sql-server/

Cursor ist aber eigentlich nicht sonderlich schwer. Im Select lädst du alle gewünschten Daten und schreibst aus dem Ergebnis immer die Daten einer Zeile in Variablen. Dann führst du deinen Befehl aus und lädst die nächste Zeile.
godlie
godlie 24.07.2024 um 11:01:11 Uhr
Goto Top
Hallo,

man will keine Bilder in der Datenbank ! Das kostet unnötig Resourcen ( RAM ), wenn eine Versionierung von Binärdateien gebraucht wird, macht man das auf FileSystem Ebene ( z.b. git ) und speichert sich nur den Pfad in der Datenbank ab.

grüße
weltklasse
weltklasse 24.07.2024 um 11:06:30 Uhr
Goto Top
Leider bekomme ich das script auch nicht mit den Cursor-Erklärungen hin.

Kann mir jemand helfen?
weltklasse
weltklasse 24.07.2024 um 11:42:29 Uhr
Goto Top
Hallo godlie,

vielen Dank für den Hinweis. Leider wünscht man sich hier die Übernahme der Bilder in die Datenbank.
Daher benötige ich die Hilfe für die Aktion.
em-pie
em-pie 24.07.2024 um 12:10:34 Uhr
Goto Top
Moin,

Vorab: nutze bitte einmal die Code-Tags hier

Zu deinem Problem:
Du hast die nachfolgende Struktur, richtig?
Artikel_GUID 				ArtikelNummer	Bildimport 			Bildlink
------------------------------------------------------------------------------------------------
6EF40F0C-19B8-470D-AAB5-4B0C361B6F76 	010379019 	D:\Daten\Bilder\61313.jpg	NULL
5F4884D9-E0CA-4117-8C4F-F733C703DEA4 	010379030 	D:\Daten\Bilder\61329.jpg	NULL
FF1E3C05-72F8-4F91-BC5F-C87EA05BBB31 	010379040 	D:\Daten\Bilder\61478.jpg	NULL
752C4620-4FCB-4D66-8C99-9F1ED0E476BA 	010379075 	D:\Daten\Bilder\61617.jpg	NULL
A60786F9-6D5A-4630-B9C1-03AEECCEB31B 	010825582 	D:\Daten\Bilder\61101.jpg	NULL
E4D31FAE-FB9E-4767-8671-7CD16FA9506F 	010825589 	D:\Daten\Bilder\61009.jpg	NULL

Lösungsansatz (ungetestet):
UPDATE [hsv].[dbo].[w_Bilddatei]
SET Bildlink = (SELECT BulkColumn FROM OPENROWSET (BULK [BildImport], SINGLE_BLOB) 

Deine Spalte "BildLink" muss nur einen anderen Datentypen haben: VARBINARY (max)

Ansonsten probiere es mal per STORED PROCEDURE:
weltklasse
weltklasse 24.07.2024 um 12:23:42 Uhr
Goto Top
Folgendes script habe ich erstellt:

BEGIN
declare @guid uniqueidentifier;
declare @pfad nvarchar(200);
declare @bild varbinary(max);
declare MeinZeiger cursor for
SELECT Artikel_GUID, Bildlink FROM [hsv].[dbo].[w_Bilddatei];
OPEN MeinZeiger;
FETCH NEXT FROM MeinZeiger INTO @guid, @pfad;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE [hsv].[dbo].[w_Bilddatei] SET Bildimport = (SELECT BulkColumn FROM OPENROWSET (BULK @pfad, SINGLE_BLOB) AS x WHERE Objekt = @guid
FETCH NEXT FROM MeinZeiger INTO @guid, @pfad;
END
CLOSE MeinZeiger;
DEALLOCATE MeinZeiger;
END;

Folgender Fehler wird angezeigt:

Meldung 102, Ebene 15, Status 1, Zeile 12
Falsche Syntax in der Nähe von '@pfad'.

Wo liegt der Fehler?
ukulele-7
ukulele-7 24.07.2024 um 14:14:05 Uhr
Goto Top
Hinter AS x und vor WHERE muss noch eine Klammer geschlossen werden. Der Fehler ist aber auch schon in deinem Post #3. Er ordnet das WHERE dem OPENROWSET zu, nicht dem UPDATE Statement.
MirkoKR
MirkoKR 24.07.2024 um 14:24:19 Uhr
Goto Top
Leider wünscht man sich hier die Übernahme der Bilder in die Datenbank.
Daher benötige ich die Hilfe für die Aktion.

Bleibt die Frage, warum?

Um das Bild gegen Fremdladen abzusichern?
Das wird nicht funktionieren, da letztlich das Bild als selbiges beim Client landet und als selbiges abgespeichert werden kann.

Wäre also nur der Weg sinnvoll, das nur angemeldete Benutzer die Bilder aus dem DB-Link abrufen können ...

das entweder direkt, oder via Temp-Kopie ...

... die Steuerung erfolgt dabei aber nicht vom DB- sondern vom Webserver ...
weltklasse
weltklasse 25.07.2024 um 08:28:29 Uhr
Goto Top
Hallo ukulele-7,

vielen Dank für den Hinweis. Das Komma habe ich jetzt gesetzt, leider
wird immer noch der gleiche Fehler angezeigt.

BEGIN
declare @guid uniqueidentifier;
declare @pfad nvarchar(200);
declare @bild varbinary(max);
declare MeinZeiger cursor for
SELECT Artikel_GUID, Bildlink FROM [hsv].[dbo].[w_Bilddatei];
OPEN MeinZeiger;
FETCH NEXT FROM MeinZeiger INTO @guid, @pfad;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE [hsv].[dbo].[w_Bilddatei] SET Bildimport = (SELECT BulkColumn FROM OPENROWSET (BULK @pfad, SINGLE_BLOB) AS x) WHERE Objekt = @guid
FETCH NEXT FROM MeinZeiger INTO @guid, @pfad;
END
CLOSE MeinZeiger;
DEALLOCATE MeinZeiger;
END;

Folgender Fehler wird angezeigt:

Meldung 102, Ebene 15, Status 1, Zeile 12
Falsche Syntax in der Nähe von '@pfad'.
MadMax
Lösung MadMax 25.07.2024 um 14:18:33 Uhr
Goto Top
Hallo,

Du darfst keine Varaiblen oder Spalten als Pfad angeben, das muß schon ein String sein. Da kommst Du um dynamisches SQL nicht herum. Probier mal:
BEGIN
declare @guid uniqueidentifier;
declare @pfad nvarchar(200);
declare @bild varbinary(max);
declare @nsql nvarchar (1000)
declare MeinZeiger cursor for
SELECT Artikel_GUID, Bildlink FROM [w_Bilddatei];
OPEN MeinZeiger;
FETCH NEXT FROM MeinZeiger INTO @guid, @pfad;
WHILE @@FETCH_STATUS = 0
BEGIN
	select @nsql = 'update [hsv].[dbo].[w_Bilddatei] set Bildimport = (select BulkColumn from OPENROWSET (BULK ''' + @pfad + ''', SINGLE_BLOB) r) where Artikel_GUID = ''' + convert (varchar (100), @guid) + ''';'  
	exec sp_executesql @nsql
FETCH NEXT FROM MeinZeiger INTO @guid, @pfad;
END
CLOSE MeinZeiger;
DEALLOCATE MeinZeiger;
END;
Gruß, Mad Max
weltklasse
Lösung weltklasse 26.07.2024 um 07:37:20 Uhr
Goto Top
Hallo Mad Max,

vielen Dank für Deine Hilfe. Dein Script läuft klasse.

Nochmals vielen Dank.