XML 데이터를 처리하는 쿼리가 있으며 커서에서 반환 된 데이터에 대해 while(@@FETCH_STATUS = 0)
루프를 사용합니다.@@ FETCH_STATUS가 커서 외부에 있습니다.
Management Studio를 사용하여 쿼리를 실행하면 @@FETCH_STATUS
은 -1이고 내 루프 안의 코드는 생략됩니다. 디버거를 사용하여 쿼리를 실행하고 계속 누르면 잘 실행되고 @@FETCH_STATUS
은 0과 같습니다. 쿼리를 다시 실행하면 디버그에서 실행 한 후 @@FETCH_STATUS
은 0이고 -1로 변경됩니다.
요약하면 :
- 을 내가 SSMS 실행 -
@@FETCH_STATUS = -1
- 내가 디버거를 실행 -
@@FETCH_STATUS = 0
(나는이 값을 원하는) 내가 SSMS 실행 - 을 한 번
@@FETCH_STATUS
여전히 동일 디버거를 실행 한 후 0이지만 -1로 변경됩니다.
나는 OPEN cursor
, 및 DEALLOCATE cursor
을 사용합니다. 왜 이런 방식으로 작동합니까?
편집 :
IF (OBJECT_ID('dbo.XmlOrderResponses') IS NOT NULL)
DROP TABLE XmlOrderResponses;
CREATE TABLE XmlOrderResponses (
OrderResponseType INT
,OrderResponseNumber NVARCHAR(40)
,OrderResponseDate DATETIME
,DocumentFunctionCode NVARCHAR(40)
,Remarks INT
);
DECLARE CUR CURSOR
FOR
SELECT Subdirectory
FROM XMLFiles;
OPEN CUR
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @DocHandle AS INT;
DECLARE @TMP AS NVARCHAR(512);
FETCH NEXT
FROM Cur
INTO @TMP
DECLARE @XmlDocument AS NVARCHAR(MAX);
SET @XmlDocument = (
SELECT CAST(XMLSource AS NVARCHAR(max))
FROM XMLFiles
WHERE subdirectory = @TMP
);
EXEC sys.sp_xml_preparedocument @DocHandle OUTPUT
,@XmlDocument;
INSERT INTO XmlOrderResponses (
OrderResponseType
,OrderResponseNumber
,OrderResponseDate
,DocumentFunctionCode
,Remarks
)
SELECT *
FROM OPENXML(@DocHandle, '/Document-OrderResponse/*', 11) WITH (
OrderResponseType INT
,OrderResponseNumber NVARCHAR(40)
,OrderResponseDate DATETIME
,DocumentFunctionCode NVARCHAR(40)
,Remarks INT
);
EXEC sys.sp_xml_removedocument @DocHandle;
END
CLOSE CUR;
DEALLOCATE CUR;
--I know I shouldn't be doing that but I can't get rid of NULL records the other way.
DELETE
FROM XmlOrderResponses
WHERE OrderResponseType IS NULL
AND OrderResponseNumber IS NULL
AND OrderResponseDate IS NULL
AND DocumentFunctionCode IS NULL
AND Remarks IS NULL;
SELECT *
FROM XmlOrderResponses
SELECT @@FETCH_STATUS
나는 당신이 무엇을 요구하는지 이해하기 위해 더 많은 코드를 볼 필요가 있다고 생각한다. SQL을 게시 할 수 있습니까? – DavidG
'@@ FETCH_STATUS'는 연결의 모든 커서에 대해 전역이므로, 현재보고있는 커서가 상태를 변경하지 않았더라도 동일한 연결에서 실행중인 다른 커서가 @@ FETCH_STATUS를 변경할 수 있습니다. 중단 점을 가진 실행의 특성이 오래 지속되어 디버깅 할 때 특히 문제가 될 수 있습니다. -'SELECT @ fetch_status] FROM sys.dm_exec_cursors (@@ SPID) WHERE Name = '@@ FETCH_STATUS'대신 'YourCursorName''을 사용할 수 있습니다. – GarethD
그리고 코드를 게시 할 때 커서가 실제로 필요한지 확인할 수도 있습니다. :) – NickyvV