VARCHAR(MAX)在连接字符串时表现奇怪
我有一个连接查询:
DECLARE @path NVARCHAR(max)
SELECT @path = ISNULL(@path + '/', '') + url_segment
FROM navigation_self_and_parents(2813) ORDER BY depth ASC
SELECT @path
navigation_self_and_parents(2813)
返回
id par_id title url_segment sequence depth
2813 2816 testing1234 testing1234 0 0
2816 2809 U /fixedurl 0 -1
2809 NULL E E 0 -2
我的连接查询返回
'testing1234' when using `NVARCHAR(MAX)` and 'E//fixedurl/testing1234' when using `NVARCHAR(4000)`
我最好的猜测是,使用NVARCHAR(MAX)
会导致@path在每次设置时都会被重新输入,因此在重新输入之前丢失了内容集,或者在首次设置时键入内容,然后后续的串联调用失败。
我很想真正理解这种行为的根本原因。
UPDATE
navigation_self_and_parents:
USE [SomeDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[navigation_self_and_parents]
(
@id int
)
RETURNS TABLE
AS
RETURN
(
WITH navigation_self_and_parents (id, parent_id, title, url_segment, sequence_number, depth)
AS
(
SELECT id, parent_id, title, url_segment, sequence_number, 0 FROM navigation_node WHERE id=@id
UNION ALL
SELECT n.id, n.parent_id, n.title, n.url_segment, n.sequence_number, depth - 1 From navigation_node as n
INNER JOIN navigation_self_and_parents as rn
ON n.id = rn.parent_id
)
SELECT * FROM navigation_self_and_parents
)
navigation_node DDL:
CREATE TABLE [dbo].[navigation_node](
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](128) NULL,
[url_segment] [nvarchar](max) NULL,
[hidden] [bit] NOT NULL,
[page_id] [int] NULL,
[parent_id] [int] NULL,
[sequence_number] [int] NOT NULL,
[createdOn] [datetime] NOT NULL,
[updatedOn] [datetime] NULL,
[navigation_type_id] [int] NULL,
...snap
这种字符串连接的方法通常有效,但不能保证。
关于类似问题的知识库文章中的官方行是“聚合串联查询的正确行为未定义。”
计划之间必须有一些细微的差别。 您可以调整查询以删除差异并获取所需的执行计划,或者您可以/当然只是像使用SQL Server 2005一样使用XML PATH
,并将其记录为可行。