2017-01-17 2 views
1

기본적으로 SQL을 사용하여 폴더 내의 XML 파일을 쿼리하려고합니다. XML을 쿼리하는 코드는 자체적으로 잘 작동하지만 일단 'openrowset'에서 표현식을 허용하는 문자열로 변환하면 @x를 찾을 수 없다는 오류 메시지가 나오면서 '스칼라 변수를 선언해야합니다' . sp_executesql도 있다는 것을 이해하지만 어떻게 작동하는지, 왜 필요한지 이해하지 못합니다.openrowset/"scalar 변수를 선언해야 함"을 사용하여 폴더의 XML을 반복 함 문제

미리 감사드립니다.

drop table #tmp 

CREATE TABLE #tmp(files VARCHAR(100)); 
INSERT INTO #tmp 
EXEC xp_cmdshell 'dir /B "C:\Users\USER\A\B"'; 


While (Select Count(*) From #tmp where files is not null) > 0 
Begin 

DECLARE @fileName varchar(max) 
DECLARE @filepath varchar(max) 
Declare @sql nvarchar(max) 

Select Top 1 @fileName = files From #tmp 

Set @filepath = 'C:\Users\USER\990\A\B\' + @filename 

DECLARE @n1 varchar(max) 
DECLARE @n2 varchar(max) 

Set @n1 = 'http://www.namespace1.com/file' 
Set @n2 ='http://www.namespac2.com/XMLSchema' 



SET @sql = ' 
DECLARE @x xml 

@x = R 
FROM Openrowset(Bulk ''' + @filepath + ''' , Single_Blob) AS ReturnData(R); 
WITH XMLNAMESPACES(DEFAULT '''[email protected]+''' 
          ,'''[email protected]+''' AS xsi) 

INSERT INTO [dbo].[IRS] 
      ([A] 
      ,[B] 
      ,[C] 
      ) 
    Select 
     ct.value('''+'(../../Data/A/)[1]'+''','''+'varchar(max)'+''') 
     ,ct.value('''+'(../../Data/B)[1]'+''','''+'varchar(max)'+''') 
     ,ct.value('''+'(../../Data/C/)[1]'+''','''+'varchar(max)'+''') 

FROM @x.nodes('''+'/Return/ReturnData/IRS990ScheduleH'+''') AS A(ct) 
' 

exec(@sql) 
Delete from #tmp Where files = @FileName 

End 
+0

'DECLARE @x xml;/* 여기에 SELECT가 필요합니다. */@x = R'' - PRINT @sql;은 보통 꽤 효과적인 디버깅 기법입니다. –

+0

감사합니다. Aaron, @sql 부분은 자체 쿼리 일 때 작동했지만 현재는 동적이어서 잘 작동하지 않습니다 (X가 선언되지 않았다고 말함). 감사합니다. 디버깅을 위해 PRINT를 사용했는데 상황이 정상적으로 처리되었습니다. – riyadude

+1

서면, 동적 또는 그렇지 않은 것으로 작동 할 수 없습니다. 'DECLARE @x xml @x = R FROM ...'은 단순히 완전히 잘못된 구문입니다. 작동중인 정적 쿼리는 약간 다르게 보일 것입니다. –

답변

1

나는 당신의 오류가 여기 일이 생각 :

DECLARE @x xml 

@x = Something 

어느

DECLARE @x XML=SomeXml; 
or 
DECLARE @x XML=(SELECT SomeXml FROM SomeWhere); 

또는

DECLARE @x xml; 

다음 중 하나

을 사용하여
SET @x=SomeXml; 
or 
SET @x=(SELECT SomeXml FROM SomeWhere); 
or 
SELECT @x=SomeXml FROM SomeWhere; 
+0

감사합니다. 지금 당장은 "@x = R Fromrowset (Bulk ''+ @filepath + '' ', Single_Blob) AS ReturnData (R)"부분에서 동적 쿼리로 바꾸기 전에 제대로 작동하도록했습니다. . – riyadude

+0

@riyadude 나는 이것이 작동하고 있는지 의심 스럽다. 'DECLARE @x XML;을 사용해보십시오. SELECT @ x = R FROM ... 'SELECT'가 차이를 만들어야합니다 ... – Shnugo

+0

그 캐치를 가져 주셔서 감사합니다. 게시 오류입니다. – riyadude

관련 문제