Вставить в SQL Server с переменной - PullRequest
3 голосов
/ 15 декабря 2011

Я использую Microsoft Sql Server 2008. Я использую представление (dbo.building_piclink), чтобы получить имена фотографий (@imgName) и вставить фотографии в таблицу из файла. Мне также нужно взять это имя фотографии и добавить его в столбец с именем att_name, но я не могу понять синтаксис оператора вставки, чтобы добавить его.

DECLARE @imgString varchar(800)
DECLARE @insertString varchar(3000)
DECLARE @imgNumber int
Declare @imgName varchar(100)

SET @imgNumber = 1

WHILE @imgNumber <> 10

BEGIN

SELECT @imgName = Lower(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'

Print @insertString

SET @imgNumber = @imgNumber + 1

EXEC(@insertString)   

END

GO

Я пытался

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

но я получаю такую ​​ошибку:

Сообщение 208, Уровень 16, Состояние 1, Строка 1 Неверное имя объекта 'B26382_3_775682.jpg'

Я пытался просто вставить att_name:

SET @insertString = 'INSERT INTO dbo._buildingpoint__ATTACH (ATT_NAME)' + @imgName

без удачи. Я что-то упустил в синтаксисе.

Спасибо!

1 Ответ

1 голос
/ 15 декабря 2011

Ну, да, ваша строка вставки неверна - сейчас вы получаете что-то вроде:

INSERT INTO dbo._building__ATTACH (DATA, ATTNAME)
   SELECT * 
   FROM OPENROWSET(BULK N'b26382_3_775682.jpg', SINGLE_BLOB) as tempImg, b26382_3_775682.jpg

, а если вы хотите вставить имя файла в виде строки, вам нужно поместить его водинарные кавычки (и я бы также изменил порядок столбцов в INSERT):

INSERT INTO dbo._building__ATTACH (ATTNAME, DATA)
   SELECT 
      'b26382_3_775682.jpg', tempImg.* 
   FROM 
      OPENROWSET(BULK N'b26382_3_775682.jpg', SINGLE_BLOB) as tempImg 

Кроме того, как предложил Джон на все руки: можете ли вы попробовать запустить только этот оператор INSERT визоляция, просто чтобы посмотреть, правильно ли работает это утверждение?Как только это сработает, - затем интегрируйте его в свой сохраненный процесс и превратите в динамический оператор SQL ...

Обновление: да - как я уже сказал в своем ответе (несколько строк отздесь): вам нужно поместить имя файла, который вы хотите вставить в attName, в одинарные кавычки - ваши последние комментарии по-прежнему этого не делают ....

Попробуйте это:

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

Это работает?

...