유래의 질문에 대답에서
좋아, 첫 번째 균열 ...
당신은 두 가지 문제가 있습니다 - 먼저 SQL 테이블 또는 테이블 변수로 폴더에서 파일 이름을 받고, 다음 XML을 읽는 각각에서. 당신이 대량 INSERT 당신을 매개 변수를 가지고하지 않기 때문에 조금 까다은 SQL 행에 XML 파일입니다 변환,
DECLARE @Folder VARCHAR(255) = 'C:\temp\*.xml'
DECLARE @Command VARCHAR(255)
DECLARE @FilesInAFolder TABLE (XMLFileName VARCHAR(500))
--
SET @Command = 'DIR ' + @Folder + ' /TC /b'
--
INSERT INTO @FilesInAFolder
EXEC MASTER..xp_cmdshell @Command
--
SELECT * FROM @FilesInAFolder
WHERE XMLFileName IS NOT NULL
두 번째 부분을 xp_cmdshell을 사용하여 괜찮다면
첫 번째는 쉽다 XML 표 유형으로 BULK INSERT를 수행 할 수 없습니다. 다음은 하나의 파일에서 작동하는 코드입니다 ...
DECLARE @x xml
DECLARE @Results TABLE (result xml)
DECLARE @xmlFileName NVARCHAR(300) = 'C:\temp\YourXMLFile.xml'
DECLARE @TempTable TABLE
(
ID INT,
Article NVARCHAR(50),
doctext NVARCHAR(MAX)
)
/* ---- HAVE TO USE DYNAMIC sql BECAUSE BULK INSERT WON'T TAKE A PARAMETER---------*/
DECLARE @sql NVARCHAR(4000) =
'SELECT * FROM OPENROWSET (BULK ''' + @xmlFileName + ''', SINGLE_BLOB)AS xmlData'
/* ---- have to use a normal table variable because we can't directly bulk insert
into an XML type table variable ------------------------------------------*/
INSERT INTO @results EXEC(@SQL)
SELECT @x = result FROM @Results
/* ---- this is MUCH faster than using a cross-apply ------------------------------*/
INSERT INTO @TempTable(ID,Article,doctext)
SELECT
x.value('ID[1]', 'INT' ),
x.value('Article[1]', 'NVARCHAR(50)' ),
x.value('doctext[1]', 'NVARCHAR(MAX)')
FROM @x.nodes(N'/doc') t(x)
SELECT * FROM @TempTable
이제 하드 비트가이 두 가지를 넣고 있습니다. 이 코드를 함수에 넣으려면 여러 가지 방법을 시도했지만 함수에서 동적 SQL 또는 EXEC를 사용할 수없고 함수에서 SP를 호출 할 수 없으며 코드를 두 개의 별도 SP에 넣을 수 없습니다. 계단식 EXEC 명령문이 있습니다. 예를 들어, EXEC에 EXEC가있는 코드를 EXEC에 넣으십시오. 두 코드 블록을 함께 넣으려면 커서를 사용해야합니다. @FilesInAFolder는 각 XMLFileName 값을 변수 @XMLFileName으로 두 번째 코드 블록에 전달하거나 SSIS 또는 CLR을 사용합니다.
죄송합니다. 매개 변수와 커서로 디렉토리 이름을 사용하여 완전한 SP를 작성하는 데 시간이 모자 럽습니다.하지만 이것은 매우 간단합니다. 휴!
그럼이 절차는 어디에서 파일을 가져 옵니까? java 또는 다른 것이 아닌 SQL Server를 사용하여 코드를 실행하려고합니다. –
RealUlysee는 파일 이름을 가져올 것을 제안했지만 SSIS를 사용하고 Foreach 루프 컨테이너를 사용하는 것이 좋습니다. 거기에서 폴더를 지정하고이를 저장된 proc의 입력으로 사용할 수 있습니다 (또는 SQL 코드를 SSIS에 그대로 저장) – thursdaysgeek