2016-07-29 3 views
0

을 다운로드 할 수 있도록 XML 파일을 가져 오는 프로그램을 개발 중입니다 (본질적으로 백업 복사본). 이 시점에서 OPENROWSET : sp_executesql 문이 @param에서 실패 함

나는 SQL Server에 내 데이터를 자주 백업을 할 수 있도록 프로세스를 자동화하고, 어떤 이유로 나는 XML 파일이 위치 할 OPENROWSET을 실행할 수있는 쿼리를 개발에 붙어있다.

DECLARE @SQL NVARCHAR(MAX) 
DECLARE @ParamDefinition NVARCHAR(500) = N'@fstring NVARCHAR(MAX)' 
DECLARE @string VARCHAR(MAX) = 
N'C:\[FilePath]\Reviews\thehesperian2016-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를 읽을 방법입니다. 나는 이것이 왜 잘못되었는지 알아 내려고 노력하면서 몇 시간을 보냈다. 나는 BULKINSERT이 example뿐만 QUOTENAME를 사용할 수 있지만, 나는 (따라서 여전히 sp_executesql를 사용) 동적 SQL에서이 모든 것을 포함하는 기대했다

무엇 또는 왜 나는이 잘못을하고있는 중이 야? 어떤 도움이라도 대단히 감사하겠습니다. - 감사합니다,

OPENROWSET - MSDN가 자신의 단락에서 선언

답변 : 나는 어쨌든 몇 가지 사소한 REPLACE 기능을 실행 않았지만

OPENROWSET does not accept variables for its arguments.

QUOTENAME, 충분하다.

+0

동적 SQL에서 @fstring은 변수가 아닌 리터럴로 간주됩니다. – scsimon

+0

@scsimon right, proc 매개 변수를 통해 fstring을 호출했음을 잊어 버렸습니다. 그래서 SQL Server가 어떻게 이해했는지 추측해서는 안됩니다. –

+0

동적 SQL의 경우 + '' '@var' " '+로 연결해야하지만 OPENROWSET에 있는지 확실하지 않은 경우가 있습니다. 나는 그것이 작동 할 것이라고 생각하지 않는다 – scsimon

답변

1

데이터 파일 경로 OPENROWSET 함수가 매개 변수를 허용하지 않습니다. 대신, 문자와 함께 필요한 문자열을 구축 :

DECLARE @string varchar(MAX) = N'C:\[FilePath]\Reviews\thehesperian2016-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 queries are not autoparameterized에 유의하십시오. 여기에 sp_executesql 또는 EXECUTE으로 쿼리를 실행해도 아무런 차이가 없습니다.

+0

이것은 sp_executesql을 사용하는 포인트를 무효화합니다. 또한, @fstring이 proc에서 매개 변수로 호출되는 것을 언급하지 않음으로써 우연히 만회 했으므로 ... 이론적으로 SQL 서버는이를 변수로 처리 할 수 ​​있어야합니다. 맞습니까? –

+0

@clifton_h라면, EXEC (@SQL) 대신에'sp_executesql @ SQL'을 사용할 수 있습니다 만, 이것이 당신의 선호 사항이지만 매개 변수없이 요구할 필요는 없습니다. 리터럴 문자열 만 파일 이름 인수로 사용할 수 있습니다. OPENROWSET은 AFAIK 매개 변수를 허용하지 않습니다. –

+0

'QUOTENAME (@string, NCHAR (39)) '을 통해 먼저 변수를 정리해야한다는 점을 제외하고는 대답을 수락합니다. 악의적 인 사용을 피하십시오. –