2015-10-08 2 views
0

Мне нужно создать хранимую процедуру, которая получает путь в качестве параметра и вставляет из файла в таблицу командой OPENROWSET.Использование динамического sql в openrowset создает ошибку

после многих поисков и попыток, я узнал, что OPENROWSET не поддерживает параметры поддержки и, следовательно, должен быть «обманут» динамическим SQL.

Это часть, которая не работает, это показывает мне странную ошибку.

Это может быть вызвано OPENROWSET, не принимающим параметр строки , но - я видел много фрагментов кода, которые построены аналогично, и пользователи говорят, что они работают.

Пожалуйста, помогите мне понять, что мне здесь не хватает, и как мне это сделать?

Спасибо!

Вот мой код:

Declare @string varchar(MAX) = 'C:\Users\akoga_000\Desktop\test1.xlsx' 
DECLARE @sqlString AS varchar(MAX)= 

'insert into gameIt_DBSummer.dbo.tblUser 
select * from openrowset(
''Microsoft.ACE.OLEDB.12.0'', 
''EXCEL 12.0;DataBase='' 
'+cast(@string as varchar(max))+' 
'';Extended Properties="EXCEL 12.0 Xml;HDR=YES'', 
''SELECT * FROM [Sheet1$]'' 
)'; 

EXEC (@sqlString) 

// Я пробовал также с EXEC sp_executesql и переменной NVARCHAR среди других вариантов

Здесь ошибка:

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'C:'.

Спасибо!

ответ

0

Я думаю, что вы получаете эту ошибку, потому что вам нужен двойной дополнительный символ, окружающий путь (переменная @string). Попробуйте следующее:

Declare @string varchar(MAX) = 'C:\Users\akoga_000\Desktop\test1.xlsx' 
DECLARE @sqlString AS varchar(MAX)= 
'insert into gameIt_DBSummer.dbo.tblUser 
select * from openrowset(
''Microsoft.ACE.OLEDB.12.0'', 
''EXCEL 12.0;DataBase='''' 
'[email protected]+' 
'''';Extended Properties="EXCEL 12.0 Xml;HDR=YES'', 
''SELECT * FROM [Sheet1$]'' 
)'; 
select @sqlString 
+0

Благодарим за ответ! Я сделал то, что вы предложили. и он semms, что он решил ошибку синтаксиса, но теперь я получаю еще одну ошибку: поставщик OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(null)» возвращенное сообщение «Не удается обновить. База данных или объект доступен только для чтения . ". Msg 7303, уровень 16, состояние 1, строка 1 Невозможно инициализировать объект источника данных поставщика OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(null)». Файл и база данных не читаются только ... Любые идеи? Спасибо! –

+0

Взгляните на это: [link] http://stackoverflow.com/questions/26267224/the-ole-db-provider-microsoft-ace-oledb-12-0-for-linked-server-null –