2009-09-15 2 views
0

У меня есть запрос, который удаляет данные из XML-строки, вставляет ее в переменную таблицы и запрашивает ее для вставки данных в другую таблицу. Он работает как очарование в моей локальной среде, но не в моей базе данных SQL Server. Сообщение об ошибке «INSERT не работает, потому что следующие параметры SET имеют неправильные настройки:« 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). В частности, ARITHABORTдолжен быть ON.

+0

Спасибо, но он не работает, когда я устанавливаю ARITHABORT ON. Я только что попробовал запустить STORED PROCEDURE непосредственно из SQL Management Studio и работает. Когда мое приложение отправляет данные, это не так, и это одни и те же данные ... –

+0

Это означает, что ваше приложение устанавливает ARITHABORT OFF. –

+0

Спасибо, я наконец узнал, что я не разместил ARITHABORT в нужном месте. Он должен попасть внутрь sproc, рядом с NOCOUNT, а не раньше, чем я пытался раньше. Abraços. –

Смежные вопросы