2009-09-15 6 views
0

XML 문자열에서 데이터를 제거하고이를 테이블 변수에 삽입하고 쿼리하여 다른 테이블에 데이터를 삽입합니다. 그것은 내 localhost 환경에서 매력처럼 실행되지만 내 프로덕션 SQL Server 데이터베이스에서는 실행되지 않습니다. "ARITHABORT"SET 옵션이 계산 된 열 및/또는 쿼리 알림 및/또는 xml 데이터 형식 메서드에서 인덱싱 된 뷰 및/또는 인덱스와 함께 사용하기에 적합한지 확인하십시오. . ""XML 데이터 형식의 쿼리에서 오류가 발생했습니다.

내 XML 데이터와 관련이 있다고 생각합니다. 내 XML 데이터는 형식이 지정되지 않은 그대로 읽혀집니다.

감사의 말 : 아마 어떤 데이터베이스 설정과 관련이 있거나, 더 나은 표준을 달성하기 위해 쿼리에서 개선해야 할 부분이있을 것입니다.

<data><dataitem evaluateduserid="208" idcompetencylevel="90" /><dataitem evaluateduserid="211" idcompetencylevel="89" /><dataitem evaluateduserid="205" idcompetencylevel="90" /></data> 

그리고 여기 내 쿼리입니다 :

는 여기에 삽입하는 것을 시도하고 데이터의 조각의 예입니다

ALTER PROC [dbo].[Spel_CM_AssessmentsDataInsertEventItem] 
    @IdAssessmentEventItem int, 
    @UserCompetencyLevel xml 
AS 
SET NOCOUNT ON 

-- XML Data model: 
-- <data> 
-- <dataitem evaluateduserid="x" idcompetencylevel="y"></dataitem> 
--</data> 

DECLARE @TableUserCompetencyLevel table 
(
    EvaluatedUserId int, 
    IdCompetencyLevel int 
) 

INSERT INTO 
    @TableUserCompetencyLevel 
    (
     EvaluatedUserId, 
     IdCompetencyLevel 
    ) 
SELECT 
    EvaluatedUserId = aa.Item.value('@evaluateduserid', 'int'), 
    IdCompetencyLevel = aa.Item.value('@idcompetencylevel', 'int') 
FROM 
    @UserCompetencyLevel.nodes('data/dataitem') AS aa(Item) 


-- Delete previously existing data. This is useful in case the user is 
-- updating an assessment event item 
DELETE FROM 
    Spel_CM_AssessmentsData 
WHERE 
    IdAssessmentEventItem = @IdAssessmentEventItem 

-- Preparing to insert data... 
DECLARE @IdAssessmentEvent int 
SELECT @IdAssessmentEvent = da.[IdAssessmentEvent] FROM Spel_CM_AssessmentsEventsItems da WHERE da.[IdAssessmentEventItem] = @IdAssessmentEventItem 


-- Inserts data into AssessmentsData table 
INSERT INTO Spel_CM_AssessmentsData 
(
    [IdAssessmentEvent], 
    [IdAssessmentEventItem], 
    [EvalatedUserId], 
    [IdCompetencyLevel] 
) 

SELECT 
    @IdAssessmentEvent, 
    @IdAssessmentEventItem, 
    ca.[EvaluatedUserId], 
    ca.[IdCompetencyLevel] 
FROM 
    @TableUserCompetencyLevel ca 
WHERE 
    (NOT ca.[EvaluatedUserId] IS NULL) 
    AND 
    ((NOT ca.[IdCompetencyLevel] IS NULL) AND (NOT ca.[IdCompetencyLevel] = '')) 

-- Updates the AssessmentsEventsItems table to confirm that the items have been inserted 
EXECUTE Spel_CM_AssessmentsEventsItemsUpdate @IdAssessmentEventItem, 1 


SET NOCOUNT OFF 

감사합니다!

답변

1

XML 데이터 형식에서는 특정 SET 옵션을 특정 방식으로 설정해야합니다. Setting Options (xml Data Type)을 참조하십시오. 구체적으로, ARITHABORTON이어야합니다.

+0

감사하지만 ARITHABORT을 (를) 설정하면 작동하지 않습니다. SQL Management Studio에서 저장 프로 시저를 직접 실행 해 보았습니다. 내 응용 프로그램에서 데이터를 전송할 때 데이터가 같지 않고 동일한 데이터입니다. –

+0

응용 프로그램이 ARITHABORT를 OFF로 설정하고 있음을 의미합니다. –

+0

고마워, 나는 마침내 알리자뱅을 적절한 장소에 두지 않았다는 것을 알게되었다. 그것은 이전에 시도했던 것처럼 NOCOUNT에 가까운 sproc 안에 들어가야합니다. Abraços. –

관련 문제