Вставка изображений из пути к файлу - не получает значения в операторе выбора - PullRequest
1 голос
/ 14 декабря 2011
DECLARE @imgString varchar(800)
DECLARE @insertString varchar(3000)
DECLARE @imgNumber int
Declare @imgName varchar(100)

SET @imgNumber = 1

WHILE @imgNumber<> 101

BEGIN

SET @imgName = 'SELECT (items) FROM dbo.building_piclink'

SET @imgString = 'C:\Documents and Settings\Administrator\Desktop\photos\' + @imgName

SET @insertString = 'INSERT INTO dbo.building__ATTACH (DATA)
SELECT * FROM OPENROWSET(BULK N''' + @imgString + ''', SINGLE_BLOB) as tempImg'

SET @imgNumber = @imgNumber + 1

END

GO

У меня проблемы с @imgName.Я не могу понять, как получить значение из оператора select, а не (элементов), как показано ниже:

C:\Documents and Settings\Administrator\Desktop\photos\SELECT (items) FROM dbo.building_piclink

Спасибо!

1 Ответ

0 голосов
/ 14 декабря 2011

Ваш код имеет несколько проблем:

1) Вы выбираете имя файла из представления - но что, если это представление содержит более одной записи? Какое имя файла вы выбираете ?? Ваш текущий код в первую очередь не работает так, как он есть, и даже если бы он работал - вы все равно потенциально можете выбрать сотни имен файлов в одну переменную - что, конечно, не сработает ....

Итак, сначала вам нужно исправить это:

SET @imgName = 'SELECT (items) FROM dbo.building_piclink'

Прежде всего - теряйте одинарные кавычки:

SELECT @imgName = (items) FROM dbo.building_piclink

Но теперь - у вас есть уникальный идентификатор, который вы можете выбрать? Или вы хотите получить только первую запись (что бы это ни было) ??

Так что либо вам нужно:

SELECT @imgName = ImageFileName FROM dbo.building_piclink WHERE .......... 

и заполните это предложение WHERE условием, гарантирующим возврат только одной строки, или используйте TOP 1:

SELECT TOP (1) @imgName = ImageFileName  FROM dbo.building_piclink 

В этом случае - вы получите только одно имя файла - если вы не укажете ORDER BY, тогда нет никакой гарантии, что вы получите - может быть, вы захотите добавить ORDER BY DueDate или что-то еще чтобы расставить приоритеты, какие имена файлов вы получите первым.

2) Ваш код для загрузки данных изображения также неработоспособен - вам нужно создать SQL-оператор в виде строки и затем выполнить его (называемый динамический SQL ) - что-то как это:

SET @imgString = 'C:\Documents and Settings\Administrator\Desktop\photos\' + @imgName

SET @insertString = 
   'INSERT INTO dbo.building__ATTACH (DATA)
    SELECT * FROM OPENROWSET(BULK N''' + @imgString + ''', SINGLE_BLOB) as tempImg'

EXEC(@insertString)   -- actually execute your SQL statement!

С этими двумя исправлениями вы должны быть в пути, чтобы заставить эту штуку работать

...