के बाद से मैं एक उपनिर्देशिका बनाने के लिए उपयोग कर रहा हूं, यह मेरे लिए एक नया path_locator
मूल्य उत्पन्न नहीं करेगा - यह केवल मौजूदा hierarchyids
की व्याख्या करेगा।
DECLARE @parentdir table(path hierarchyid not null);
DECLARE @subdir_locator hierarchyid
-- Create Parent Directory, OUTPUT inserted parent path
INSERT INTO FileTable0 (name,is_directory,is_archive)
OUTPUT INSERTED.path_locator into @parentdir
SELECT 'Directory', 1, 0
-- Create new path_locator based upon parent
SELECT @subdir_locator = dbo.GetNewPathLocator(path) from @parentdir
-- Create Subdirectory
INSERT INTO FileTable0 (name,path_locator,is_directory,is_archive)
VALUES ('subdirectory', @subdir_locator, 1, 0);
ऊपर कोड ब्लॉक default path_locator value discovered here कि एक GUID (उपयोग newid()
विधि, और सरल पार्स) से एक नया hierarchyid
प्रतिनिधित्व बनाता इस्तेमाल करता है। फ़ंक्शन GetNewPathLocator()
SQL सर्वर में कहीं भी मौजूद नहीं है जो मुझे मिल सकता है (hierarchyid.GetDescendant()
निकटतम मुझे मिल सकता है, लेकिन यह मूल संरचना का उपयोग नहीं करता है कि फ़ाइलटेबल पर निर्भर करता है)। SQL.NEXT में हो सकता है कि ...
CREATE FUNCTION dbo.GetNewPathLocator (@parent hierarchyid = null) RETURNS varchar(max) AS
BEGIN
DECLARE @result varchar(max), @newid uniqueidentifier -- declare new path locator, newid placeholder
SELECT @newid = new_id FROM dbo.getNewID; -- retrieve new GUID
SELECT @result = ISNULL(@parent.ToString(), '/') + -- append parent if present, otherwise assume root
convert(varchar(20), convert(bigint, substring(convert(binary(16), @newid), 1, 6))) + '.' +
convert(varchar(20), convert(bigint, substring(convert(binary(16), @newid), 7, 6))) + '.' +
convert(varchar(20), convert(bigint, substring(convert(binary(16), @newid), 13, 4))) + '/'
RETURN @result -- return new path locator
END
GO
समारोह GetNewPathLocator()
भी trick from this SO post का उपयोग कर एक newid()
अनुरोध के लिए एक एसक्यूएल दृश्य getNewID
की आवश्यकता है।
create view dbo.getNewID as select newid() as new_id
GetNewPathLocator()
कॉल करने के लिए, आप डिफ़ॉल्ट पैरामीटर जो एक नई hierarchyid
उत्पन्न या एक बच्चे hierarchyid
नीचे के रूप में देखा बनाने के लिए एक मौजूदा hiearchyid
स्ट्रिंग प्रतिनिधित्व (.ToString()
) में पारित करेंगे ... उपयोग कर सकते हैं
SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/
SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/
कुछ कठोर परीक्षण के बाद, ऐसा लगता है कि जब इस समानांतर में कहा जाता है अद्यतन बयान गतिरोध की संभावना है। – Tod