Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Membuat Sub Direktori melalui SQL INSERT menggunakan FileTable

Inilah yang akhirnya saya gunakan untuk membuat subdirektori sejak GetPathLocator() tidak akan menghasilkan path_locator baru nilai untuk saya - itu hanya akan menafsirkan hierarchyids yang ada .

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

Blok kode di atas menggunakan nilai path_locator default ditemukan di sini yang membangun hierarchyid baru representasi dari GUID (memanfaatkan newid() metode, dan penguraian sederhana ). Fungsi GetNewPathLocator() tidak ada di mana pun di SQL Server yang dapat saya temukan (hierarchyid.GetDescendant() adalah yang paling dekat yang bisa saya temukan, tetapi tidak menggunakan struktur asli yang diandalkan FileTable ). Mungkin di 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

Fungsi GetNewPathLocator() juga memerlukan tampilan SQL getNewID untuk meminta newid() menggunakan trik dari pos SO ini .

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

Untuk memanggil GetNewPathLocator() , Anda dapat menggunakan parameter default yang akan menghasilkan hierarchyid baru atau berikan hiearchyid yang ada representasi string (.ToString() ) untuk membuat anak hierarchyid seperti yang terlihat di bawah ini...

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. Fungsi Tabel-Bernilai - Urutan oleh diabaikan dalam output

  2. Cara terbaik untuk mendapatkan PK Guid dari baris yang disisipkan

  3. Baca file log (*.LDF) di SQL Server 2008

  4. Temukan nama tabel di semua objek dari semua database

  5. Paging dengan Entity Framework 7 dan SQL Server 2008