/ / OPENROWSET: пропускът на sp_executesql при @param - sql-сървър, wordpress, filepath, openrowset, sp-executesql

Отваряне на OPENROWSET: sp_executesql заявка в @param - sql-server, wordpress, filepath, openrowset, sp-executesql

Разработвам програма за изтегляне XML файл WordPress ви позволява да изтеглите (по същество резервно копие).

В този момент автоматизирах процеса, за да позволявам чести архивиране на данните ми SQL Server, и по някаква причина се задържам в разработването на заявката, за да стартирам OPENROWSET където XML файлът ще бъде разположен.

DECLARE @SQL NVARCHAR(MAX)
DECLARE @ParamDefinition NVARCHAR(500) = N"@fstring NVARCHAR(MAX)"
DECLARE @string VARCHAR(MAX) =
N"C:[FilePath]Reviewsthehesperian2016-07-29.xml"

SET @SQL =
N"INSERT INTO #Temp (Extract_Date, XMLDATA)
SELECT GETDATE()
, A.*
FROM OPENROWSET(BULK @fstring, SINGLE_BLOB, CODEPAGE = " + """RAW""" + ") AS A"

EXEC sp_executesql @SQL
, @ParamDefinition
, @fstring = @string

Грешката:

Msg 102, Level 15, State 1, Line 4
Incorrect syntax near "@fstring".

Мога да превърна това в проста заявка на таблица в предиката, така че имам причина да подозирам, че това е начинът filepath се чете. Прекарал съм няколко часа, докато се опитвах да разбера защо това е грешно QUOTENAME както и в това пример в BULKINSERT се надявах да вградя всичко това в динамичния SQL (така че все още да използвам sp_executesql)

Какво или защо правя това погрешно? Всяка помощ ще бъде много оценявам. - За разбирането,

ОТГОВОР

OPENROWSET - MSDN декларира в собствения си параграф:

OPENROWSET не приема променливи за аргументите си.

QUOTENAME Достатъчно е, макар че бях изпълнил няколко незначителни REPLACEтака или иначе.

Отговори:

1 за отговор № 1

Пътят към файла с данни на функцията OPENROWSET не позволява даден параметър. Вместо това, изградете необходимия низ с литерала:

DECLARE @string varchar(MAX) = N"C:[FilePath]Reviewsthehesperian2016-07-29.xml";
DECLARE @SQL nvarchar(MAX);
SET @SQL =
N"INSERT INTO #Temp (Extract_Date, XMLDATA)
SELECT GETDATE()
, A.*
FROM OPENROWSET(BULK " + QUOTENAME(@string, """") + ", SINGLE_BLOB, CODEPAGE = ""RAW"") AS A";
EXEC sp_execute @SQL;

--EXECUTE(@SQL);

UPDATE:

Добавен е QUOTENAME в случай, че предоставеният път на файл е от ненадежден източник. Също така имайте предвид, че Заявките OPENROWSET не са автопараметризирани, Няма значение дали един изпълнява заявката с sp_executesql или EXECUTE тук.