Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo thư mục con thông qua SQL INSERT sử dụng FileTable

Đây là những gì tôi đã sử dụng để tạo một thư mục con kể từ GetPathLocator () sẽ không tạo path_locator mới đối với tôi - nó sẽ chỉ diễn giải hierarchyids hiện có .

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);

Khối mã trên sử dụng giá trị path_locator mặc định được phát hiện tại đây xây dựng một hierarchyid mới đại diện từ GUID ( sử dụng newid () và phân tích cú pháp đơn giản ). Hàm GetNewPathLocator () không tồn tại ở bất kỳ đâu trong SQL Server mà tôi có thể tìm thấy ( hierarchyid.GetDescendant () là gần nhất mà tôi có thể tìm thấy, nhưng nó không sử dụng cấu trúc gốc mà FileTable dựa vào ). Có thể trong 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

Hàm GetNewPathLocator () cũng yêu cầu chế độ xem SQL getNewID để yêu cầu newid () sử dụng thủ thuật từ bài đăng SO này .

create view dbo.getNewID as select newid() as new_id 

Để gọi GetNewPathLocator () , bạn có thể sử dụng tham số mặc định sẽ tạo ra một hierarchyid mới hoặc chuyển hiearchyid hiện có biểu diễn chuỗi ( .ToString () ) để tạo hierarchyid con như được thấy bên dưới ...

SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/
SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chuyển một mảng các giá trị số nguyên từ một bảng vào một thủ tục được lưu trữ?

  2. Có LastIndexOf trong SQL Server không?

  3. Cách tìm tên của ràng buộc not-null trong SQL Server

  4. Mô hình cơ sở dữ liệu dự kiến ​​không nhất quán trong thời gian thực

  5. Cách tách một chuỗi trong SQL Server