私は最近、画像をテーブルに挿入するのにOPENROWSET
を使い始めました。以前、私はそれぞれの画像(1枚の画像= 1巻のINSERT
書)へのパスを指定して、画像のバイナリ文字列を生成するためにPHPを使用します。しかし、私は単一のクエリですべての画像を挿入しようとしています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
)
。だから、私は各イメージへのパスをテーブルに格納し始めました。そして、以前は(PHPの文字列の代わりにテーブルのパスフィールドを使用するだけで)それぞれを挿入する必要があります。私は次のことをしようとすると、しかし、:
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 102, Level 15, State 1, Line 5
Incorrect syntax near 'ImagePath'.
を、私は(無駄に)列の名前の前後に引用符を追加してみました:
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.
これを達成する方法があるに違いありません、私はどこでも正しい構文を見つけることができません。誰でもSQL Serverにパス(文字列)を取得する方法を知っていますか?dbo.Product_Image_Mappings.ImagePath
?
UPDATE
私はあなたにdbo.Product_Image_Mappings.ImagePath
が戻ってくることを値の例を与えることを忘れていました。それは\\DEREK\WebImages\1\ca-82300.jpg
のようなパス...
UPDATE
だEirikur Eirikssonがthis threadにソリューションを提供しているように見えるが、これは、同じ目的を達成する過度に複雑な方法のように見える...
UPDATE(Eirikur Eirikssonのメソッドを使用しようとしました)
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);
これちょっと働いていたが、それはわずか42行(7200 +のうち)に挿入...私はトンを必要とします私はこのクエリについて何かを変更する必要があるかもしれないが、私はそれについて何も知らない(基本的なINSERT、SELECTなどを除いて)
また、この挿入ステートメントをマージステートメント内で使用していることにも言及しておきます。私はこれも私のオプションを制限するかもしれないと信じている(ダイナミックSQLが唯一のオプションだと思うので、私は 'TARGETでマッチしないときにダイナミックSQLを実行できるとは思っていない。) – derekmx271
FYI: 「SSCertifiable」という用語は名前ではなく、サイトへのポイントおよび/またはログインの数に関するラベルです。 。 –
最初のコードサンプルでPHPコードを使用していますが、PHPページ内にSQLを構築して実行していますか?すべてのレコードに対して完全な動的文字列を指定して実行しますが、遅くなります –