기본적으로 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
'DECLARE @x xml;/* 여기에 SELECT가 필요합니다. */@x = R'' - PRINT @sql;은 보통 꽤 효과적인 디버깅 기법입니다. –
감사합니다. Aaron, @sql 부분은 자체 쿼리 일 때 작동했지만 현재는 동적이어서 잘 작동하지 않습니다 (X가 선언되지 않았다고 말함). 감사합니다. 디버깅을 위해 PRINT를 사용했는데 상황이 정상적으로 처리되었습니다. – riyadude
서면, 동적 또는 그렇지 않은 것으로 작동 할 수 없습니다. 'DECLARE @x xml @x = R FROM ...'은 단순히 완전히 잘못된 구문입니다. 작동중인 정적 쿼리는 약간 다르게 보일 것입니다. –