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. माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005/2008:एक्सएमएल बनाम टेक्स्ट/वर्कर डेटा प्रकार

  2. SQL सर्वर 2008 में PIVOT / UNPIVOT

  3. SQL - डुप्लीकेट होने पर नवीनतम रिकॉर्ड का चयन करें

  4. विभिन्न सर्वरों पर दो डेटाबेस में दो तालिकाओं को जोड़कर डेटा की क्वेरी करना

  5. आउटपुट पैरामीटर के साथ संग्रहीत प्रक्रिया निष्पादित करें?