sql >> データベース >  >> RDS >> Sqlserver

FileTable を使用して SQL INSERT 経由でサブディレクトリを作成する

    これは、 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 Server のどこにも存在しません (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 を生成するデフォルト パラメータを使用できます または既存の hiarchyid を渡します 文字列表現 (.ToString() ) 子 hierarchyid を作成する 以下に示すように...

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


    1. RubyのCSVファイルへの列(SQLクエリ)の追加

    2. SQL Server プリンシパル dbo が存在しません。

    3. OracleのROUND(date)関数

    4. DBCAデータベースの作成が正しくありませんREMOTE_LISTENER