Разработвам програма за изтегляне 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
тук.