Ich habe gerade begonnen, OPENROWSET
zu verwenden, um Bilder in eine Tabelle einzufügen. Früher habe ich den Pfad zu jedem Bild angeben (1 Bild = 1 INSERT
-Anweisung), und verwenden Sie PHP das Image des Binärkette zu erzeugen:Wie verwende ich einen Pfad in der Tabelle mit OPENROWSET?
INSERT INTO nopCommerce..Picture (PictureBinary, MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew)
VALUES (
(
SELECT *
FROM OPENROWSET(BULK '" . $this->image['path'] . "', SINGLE_BLOB) AS Binary
),
'" . $this->image['mime_type'] . "',
'" . $this->image['seo_filename'] . "',
'" . $this->image['alt'] . "',
'',
0
)
aber ich versuche, alle Bilder mit einer einzigen Abfrage einzufügen. Also habe ich begonnen, den Pfad zu jedem Bild in einer Tabelle zu speichern, und jetzt muss ich jeden Pfad wie zuvor einfügen (nur mit dem Pfadfeld der Tabelle anstelle einer PHP-Zeichenfolge). Aber, wenn ich folgendes versuchen:
INSERT INTO nopCommerce..Picture (PictureBinary, MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew)
SELECT
(
SELECT *
FROM OPENROWSET(BULK ImagePath, SINGLE_BLOB) AS Binary
),
MimeType,
Name,
Alt,
'',
0
FROM nopRMS..Product_Image_Mappings
Ich erhalte den folgenden Fehler:
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'ImagePath'.
Also habe ich versucht, Anführungszeichen um die Spaltennamen hinzugefügt wird (ohne Erfolg):
INSERT INTO nopCommerce..Picture (PictureBinary, MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew)
SELECT
(
SELECT *
FROM OPENROWSET(BULK 'ImagePath', SINGLE_BLOB) AS Binary
),
MimeType,
Name,
Alt,
'',
0
FROM nopRMS..Product_Image_Mappings
Msg 4860, Level 16, State 1, Line 1
Cannot bulk load. The file "ImagePath" does not exist.
Es muss einen Weg geben, dies zu erreichen, ich kann nirgends die richtige Syntax online finden. Kann jemand SQL Server sagen, um den Pfad (Zeichenfolge) von dbo.Product_Image_Mappings.ImagePath
zu erhalten?
UPDATE
ich vergessen hat, ein Beispiel für einen Wert zu geben, dass dbo.Product_Image_Mappings.ImagePath
zurückkehren würde. Es ist Pfade wie \\DEREK\WebImages\1\ca-82300.jpg
...
UPDATE
Es scheint, dass Eirikur Eiriksson eine Lösung in this thread zur Verfügung gestellt hat, aber das sieht aus wie ein übermäßig komplizierte Verfahren zu deren Ende zu erreichen ...
UPDATE (Versuch mit Eirikur Eiriksson-Methode)
DECLARE @SQL_STR NVARCHAR(MAX) = N'';
SELECT @SQL_STR = STUFF(
(
SELECT
N'
UNION ALL
SELECT '
+ N'(SELECT X.BulkColumn FROM OPENROWSET(BULK '
+ NCHAR(39) + im.ImagePath + NCHAR(39)
+ N', SINGLE_BLOB) AS X) AS PictureBinary,'
+ NCHAR(39) + im.MimeType + NCHAR(39)
+ N' AS MimeType,'
+ NCHAR(39) + im.Name + NCHAR(39)
+ N' AS SeoFilename,'
+ NCHAR(39) + REPLACE(im.Alt, '''', '''''') + NCHAR(39)
+ N' AS AltAttribute,'
+ N'NULL AS TitleAttribute,'
+ N'0 AS IsNew'
FROM nopRMS..Product_Image_Mappings im
FOR XML PATH(''), TYPE
).value('.[1]','NVARCHAR(MAX)'),1,12,N''
)
INSERT INTO nopCommerce..Picture (PictureBinary, MimeType, SeoFilename, AltAttribute, TitleAttribute, IsNew)
EXEC (@SQL_STR);
Diese irgendwie funktioniert, aber es eingefügt nur 42 Zeilen (aus 7200 +) ... ich brauche t sein 100% genau zu sein :(Ich gebe zwar zu, muss ich vielleicht etwas über diese Abfrage ändern, aber ich weiß nichts darüber (abgesehen von der grundlegenden INSERT, SELECT, etc.)
Ich sollte auch erwähnen, dass ich diese Insert-Anweisung innerhalb einer Merge-Anweisung verwenden. Ich glaube, dass dies auch meine Optionen einschränken kann (weil es so aussieht, als wäre Dynamic SQL die einzige Option, und ich glaube nicht, dass ich Dynamic SQL innerhalb von "WENN NICHT GEMEINSAM DURCH TARGET" ausführen kann. – derekmx271
FYI: Ich habe die Formatierung aktualisiert ein wenig in der Frage, aber auch der Name der Person, die diesen Code auf dem SQL Server Central-Forum geschrieben hat Der Begriff "SSCertifiable" ist kein Name, sondern ein Label, das mit wie vielen Punkten und/oder Logins auf der Website verknüpft ist –
Sie haben PHP-Code in Ihrem ersten Codebeispiel.Sie bauen SQL innerhalb einer PHP-Seite und führen es aus? Es ist wichtig zu wissen. Ihr zweiter Code-Versuch (mit 'ImagePath') könnte mit einem Cursor erreicht werden - ein Cursor baut die vollständige dynamische Zeichenfolge für jeden Datensatz und führt es aus, aber es wäre langsam –