GetPathLocator()
. के बाद से मैंने उपनिर्देशिका बनाने के लिए इसका उपयोग किया है एक नया 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);
उपरोक्त कोड ब्लॉक डिफ़ॉल्ट path_locator मान यहां खोजा गया
जो एक नया hierarchyid
बनाता है GUID से प्रतिनिधित्व (newid()
कोड>
विधि, और सरल पार्सिंग ) फ़ंक्शन GetNewPathLocator()
SQL सर्वर में कहीं भी मौजूद नहीं है जो मुझे मिल सकता है (hierarchyid.GetDescendant()
सबसे नज़दीक है जो मुझे मिल सकता है, लेकिन यह उस मूल संरचना का उपयोग नहीं करता है जिस पर FileTable निर्भर करता है ) शायद 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()
एक SQL दृश्य की भी आवश्यकता होती है getNewID
newid()
. का अनुरोध करने के लिए इस SO पोस्ट की ट्रिक
का उपयोग करके ।
create view dbo.getNewID as select newid() as new_id
कॉल करने के लिए GetNewPathLocator()
, आप डिफ़ॉल्ट पैरामीटर का उपयोग कर सकते हैं जो एक नया hierarchyid
उत्पन्न करेगा या मौजूदा hiearchyid
. में पास करें स्ट्रिंग प्रतिनिधित्व (.ToString()
) बच्चा पैदा करने के लिए hierarchyid
जैसा कि नीचे देखा गया है...
SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/
SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/