存储过程失败,因为CONCAT_NULL_YIELDS_NULL不正确

时间:2016-10-07 20:42:19

标签: sql sql-server

我有一个生成XML的存储过程。它在DEV中运行良好,但在其他环境中,它会因以下异常消息而失败。

这对我来说是个新错误。我正在阅读关于这个问题的各种博客,但我不确定我是否完全理解它。任何建议将不胜感激。

由于

例外情况如下:

enter image description here

这是我的存储过程:

ALTER PROCEDURE [dbo].[usp_OutboundEventMessage_CREATE]
    (@EventName NVARCHAR(200),
     @Force bit = 0,
     @TopicFilter NVARCHAR(100),
     @EventContexts XML,
     @MessageBody XML OUTPUT)
AS
BEGIN
    SET NOCOUNT ON;

    ----------------------
    -- DETECT FORAMATTING: ContextKey
    ----------------------
    IF (SELECT @EventContexts.exist('(//Contexts)')) = 0
    BEGIN
        DECLARE @Contexts XML = '<Contexts>' + CONVERT(NVARCHAR(MAX), @EventContexts) + '</Contexts>';
        SET @EventContexts = @Contexts;
    END

    ----------------------
    -- CREATE FORAMATTING: DataSource
    ----------------------
    DECLARE @EmptyGuid UNIQUEIDENTIFIER = (SELECT CAST(0x0 AS UNIQUEIDENTIFIER));
    DECLARE @DataSource XML = (SELECT (SELECT SERVERPROPERTY(N'MachineName')) AS '@machineName', (SELECT Name FROM sys.databases WHERE database_id = DB_ID()) FOR XML PATH('DataSource'))
    DECLARE @Topic XML = (SELECT @TopicFilter AS Filter FOR XML PATH('Topic'))

    ----------------------
    -- GENERATE: MessageBody
    --
    -- ATTRIBUTES: Are added through as simle columns (see below)
    ----------------------
    SET @MessageBody =  (SELECT
                        @EmptyGuid AS '@auditId',
                        CASE  @Force WHEN 0 THEN 'false' ELSE 'true' END AS '@force',
                        GETUTCDATE() AS '@CreatedOn',
                        @DataSource,
                        @Topic,
                        Name = @EventName,
                        @EventContexts 
                    FOR XML PATH('Event'))
END

3 个答案:

答案 0 :(得分:1)

索引视图要求某些SET条件到位(无论如何它们都是推荐的设置)。存储过程应该在其下执行的设置在创建时被记录。如果这两个不匹配,并且您在过程中使用索引视图,则会出现此错误。

要解决此问题,请删除该过程,在会话中启用该设置,然后重新创建该过程。

答案 1 :(得分:1)

我确定您所阅读的博客解释了该设置的作用,并MSDN进一步解释。

要解决您的问题,您只需在存储过程的顶部添加以下内容:

SET CONCAT_NULL_YIELDS_NULL ON

答案 2 :(得分:-1)