使用XML数据类型进行查询时出错

时间:2009-09-15 22:57:38

标签: sql sql-server xml tsql

我有一个查询从XML字符串中删除数据,将其插入表变量并查询它以将数据插入另一个表中。它在我的localhost环境中像魅力一样运行,但在我的生产SQL Server数据库中运行。错误消息是“INSERT失败,因为以下SET选项具有不正确的设置:'ARITHABORT'。验证SET选项是否正确用于索引视图和/或计算列和/或查询通知和/或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 个答案:

答案 0 :(得分:1)

XML数据类型要求以某种方式设置某些SET选项。见Setting Options (xml Data Type)。具体而言,ARITHABORT 必须ON