Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Алтернатива на функцията за динамичен SQL

Една опция би била да се създаде изглед от всички таблици 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Задайте публичен профил по подразбиране за поща от база данни (SSMS)

  2. Примери за преобразуване на „дата“ в „datetimeoffset“ в SQL Server (T-SQL)

  3. 'PDOException' със съобщение 'SQLSTATE[22001]:Данни низове, съкратено вдясно:0

  4. Обединете два дяла в един в SQL Server (T-SQL)

  5. Маса с много колони