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

動的 SQL の関数の代替

    1 つのオプションは、すべての project_xxx テーブルからビューを作成することです。次のようなもの:

    CREATE VIEW SecurityTable
    AS
    SELECT 'Project_1', User, HasAccess
    FROM   Project_1
    UNION
    SELECT 'Project_2', User, HasAccess
    FROM   Project_2
    UNION
    SELECT 'Project_3', User, HasAccess
    FROM   Project_3
    etc...
    

    次に、あたかもデータベースがそもそも適切に設計されているかのように、ビューをクエリするだけです;-)

    SELECT ProjectID, User
    FROM   SecurityTable
    WHERE [criteria]
    AND   HasAccess=1
    

    新しいプロジェクト テーブルを頻繁に追加するとおっしゃっていますが、セキュリティ テーブルに毎朝動的クエリを入力することをお勧めします。例:
    CREATE TABLE Project_1 (
        Usr varchar(20),
        HasAccess bit)
    GO
    CREATE TABLE Project_2 (
        Usr varchar(20),
        HasAccess bit)
    GO
    CREATE TABLE SecurityTable (
        Usr varchar(20),
        HasAccess bit)
    GO
    
    
    INSERT INTO Project_1 (Usr, HasAccess) VALUES ('Kermit', 1)
    INSERT INTO Project_1 (Usr, HasAccess) VALUES ('MissPiggy', 1)
    INSERT INTO Project_2 (Usr, HasAccess) VALUES ('Beaker', 1)
    INSERT INTO Project_2 (Usr, HasAccess) VALUES ('TheCount', 0)
    GO
    
    Create Procedure LoadSecurityTable 
    AS
        DELETE * FROM SecurityTable
    
        EXEC sp_MSForEachTable 
            @command1 = 'INSERT INTO SecurityTable (Usr, HasAccess) SELECT Usr, HasAccess FROM ?',
            @whereand = 'AND o.name LIKE ''Project_%'''
    GO
    
    EXEC LoadSecurityTable
    SELECT * FROM SecurityTable
    


    1. MySql Xml関数のパフォーマンス?

    2. EclipseLinkバッチ挿入が非常に遅い

    3. DBCC_OBJECT_METADATAラッチ

    4. SQL Server 2008で画像データ型をvarcharに変換します