2011-01-24 9 views
7

श्रृंखलाबद्ध मैं एक श्रृंखलाबद्ध प्रश्न हैं:VARCHAR (मैक्स) अद्भुत व्यवहार कर जब स्ट्रिंग

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 को प्रत्येक बार सेट करने के लिए @path को फिर से टाइप किया जा सकता है और इस प्रकार रीटिपिंग से पहले सामग्री सेट को खो देता है या इसे पहली बार सेट किया जाता है और उसके बाद कॉन्सटेनेटिंग कॉल चुपचाप विफल हो जाती है।

हालांकि मुझे इस व्यवहार के मूल कारण को वास्तव में समझना अच्छा लगेगा।

अद्यतन

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 [email protected] 
     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 
+0

'url_segment' का प्रकार क्या है? –

+0

मेरे पास पहले से सम्मिलित करने के लिए इस दृष्टिकोण के साथ समान परिणाम हुए हैं। (जहां यह केवल एक पंक्ति से मूल्य के साथ समाप्त होता है) मैंने कभी नहीं देखा है कि 'डेटाटाइप' ने एक भूमिका निभाई है। कभी-कभी आपको आवश्यक निष्पादन योजना प्राप्त करने के लिए क्वेरी को थोड़ा सा ट्विक करने की आवश्यकता होती है। क्या आप दोनों योजनाएं पोस्ट कर सकते हैं? (या आप निश्चित रूप से एक्सएमएल पाथ का उपयोग कर सकते हैं क्योंकि आप SQL Server 2005 पर हैं जो काम करने के लिए प्रलेखित है) यह भी देखें http://support.microsoft.com/kb/287515/en-us –

+0

@El Ronnoco ने और अधिक प्रश्न अपडेट किया विवरण। –

उत्तर

4

स्ट्रिंग संयोजन करने के लिए इस दृष्टिकोण आमतौर पर काम करता है, लेकिन यह गारंटी नहीं है।

the KB article for a similar issue में आधिकारिक पंक्ति यह है कि "कुल समावेशन क्वेरी के लिए सही व्यवहार अपरिभाषित है।"

योजनाओं के बीच कुछ सूक्ष्म अंतर होना चाहिए। आप अंतर को हटाने के लिए क्वेरी को ट्विक कर सकते हैं और आवश्यक निष्पादन योजना प्राप्त कर सकते हैं या आप निश्चित रूप से XML PATH का उपयोग कर सकते हैं क्योंकि आप SQL Server 2005 पर हैं और यह काम करने के लिए प्रलेखित है।

+0

@ मार्टिन - मैंने इसे असफल नहीं देखा है। लिंक कुल प्रश्नों में कार्यों का उपयोग करने के लिए संदर्भित करता है, जो समझ में आता है। लेकिन क्या यह यहां लागू होता है? – RichardTheKiwi

+0

@cyberkiwi - क्या आपने लिंक में कोड देखा था? यह किसी भी योग का उपयोग नहीं करता है। 'एलटीआरआईएम (आरटीआरआईएम (सी 1) द्वारा टी 1 ऑर्डर से @ स्ट्र 1 + सी 1 = 'स्ट्र 1 + सी 1)' –

+0

@ मार्टिन - एफवाईआई यह टेक्स्ट को एक चर में 'समेकित' कर रहा है। एलटीआरआईएम, आरटीआरआईएम – RichardTheKiwi

संबंधित मुद्दे