【问题标题】:Error in query with XML data type使用 XML 数据类型进行查询时出错
【发布时间】:2009-09-15 22:57:38
【问题描述】:

我有一个查询,它从 XML 字符串中剥离数据,将其插入表变量并查询它以将数据插入另一个表。它在我的本地主机环境中运行起来就像一个魅力,但在我的生产 SQL Server 数据库中却没有。错误消息是“插入失败,因为以下 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

谢谢!

【问题讨论】:

    标签: sql sql-server xml tsql


    【解决方案1】:

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

    【讨论】:

    • 谢谢,但是当我将 ARITHABORT 设置为 ON 时它不起作用。我刚刚尝试直接从 SQL Management Studio 运行 STORED PROCEDURE,它可以工作。当我的应用程序发送数据时,它没有发送数据,它是相同的数据......
    • 这意味着您的应用程序正在将 ARITHABORT 设置为 OFF。
    • 谢谢,我终于发现我没有把ARITHABORT放在正确的地方。它应该进入 sproc 内部,靠近 NOCOUNT,而不是像我之前尝试过的那样在它之前。阿布拉索斯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2012-04-22
    • 1970-01-01
    • 2011-12-08
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多