2016-04-09 9 views
0

In meiner Datenbank gibt es 85 Tabellen und rund 62 Tabellen haben eine gemeinsame Spalte ArchiveID. Ich habe andere Tabelle EDSArchiveHistoryAktualisieren mehrerer Tabellen mit einer einzigen Abfrage in SQL Server

CREATE TABLE [dbo].[EDSArchiveHistory] 
(
    [ArchiveID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [ArchiveDate] [datetime] NOT NULL, 
    [ArchiveName] [nvarchar](200) NOT NULL 
) 

Wenn ich alle Datensätze in EDSArchiveHistor einzufügen, ich die ArchiveID des eingefügten Datensatz zu übernehmen möchten, und alle Tabellen aktualisieren, die eine ArchiveID Spalte haben.

Grundsätzlich schreibe ich Abfrage alle Tabellen zu finden, die ArchiveID Spalte

SELECT NAME 
FROM SYS.TABLES 
WHERE OBJECT_ID IN (SELECT OBJECT_ID AS NAME 
        FROM SYS.COLUMNS 
        WHERE NAME LIKE '%ARCHIVEID%') 
    AND NAME <> 'EDSARCHIVEHISTORY' 
ORDER BY NAME 

haben, aber ich weiß nicht, wie diese Tabellen mit einer einzigen Abfrage zu aktualisieren.

Bitte helfen Sie mir, wenn es möglich ist.

+0

Sie können es durch Trigger oder gespeicherte Prozedur tun. –

+1

Sie müssen eine gespeicherte Prozedur schreiben, die eine Schleife über jede Tabelle in einem Datensatz/Cursor ausführt und dann eine dynamische Anweisung ausführt, um diese Tabelle mit einem gegebenen archieid zu aktualisieren (wahrscheinlich, wo archividid null ist). –

+0

Ja, ich werde durch Trigger gehen, aber ich nicht, welche Abfrage zu schreiben, um alle Tabellen innerhalb Trigger zu aktualisieren. Wenn ich mehrere Update-Abfrage schreibe, muss ich 60+ Update-Abfrage schreiben. Ich denke, das ist kein guter Ansatz. – Anjyr

Antwort

0

Zum Aktualisieren mehrerer Tabellen durch einzelne Abfragen ist eine dynamische SQL-Abfrage möglich.

ALTER PROCEDURE sp_ArchiveManagment 
@paramARCHIVEID INT 
AS 
DECLARE @TempTableList TABLE (ID INT IDENTITY(1,1),NAME NVARCHAR(300)) 
BEGIN 
    INSERT INTO @TempTableList (NAME) (
     SELECT NAME FROM SYS.TABLES 
     WHERE OBJECT_ID IN (
         SELECT OBJECT_ID AS NAME FROM SYS.COLUMNS 
         WHERE NAME LIKE '%ARCHIVEID%' 
         ) AND 
      NAME <> 'EDSARCHIVEHISTORY') 

    DECLARE @REC_ID AS INT 
    SET @REC_ID = 1 
    DECLARE @SQLQUERY AS NVARCHAR(MAX) 
    WHILE (@REC_ID <= (SELECT COUNT(*) FROM @TempTableList)) 
    BEGIN 
     DECLARE @TblName VARCHAR (200)  
     SET @TblName=(SELECT NAME FROM @TempTableList WHERE [email protected]_ID) 
     SET @SQLQUERY= 'UPDATE '[email protected]+' SET ARCHIVEID ='+CAST(@paramARCHIVEID AS VARCHAR(4))+' WHERE ARCHIVEID IS NULL' 
     EXECUTE(@SQLQuery) 
     SET @REC_ID= @REC_ID + 1 
    END 
END 

Here is good article for Dynamic SQL

0

Ich nehme dies technisch nicht eine einzelne Abfrage ist, weil es eine dynamische SQL-Anweisung erstellt, die viele Abfragen enthalten. Trotzdem ist es eine relativ einfache Möglichkeit, alle Tabellen zu aktualisieren.

DECLARE @archiveId int 

-- After inserting into EDSArchiveHistory 
SET @archiveId = SCOPE_IDENTITY() 

DECLARE @sql VARCHAR(MAX) = '' 
SELECT @sql += 'UPDATE ' + NAME + ' SET ARCHIVEID = ' + CONVERT(VARCHAR, @archiveId) + ';' 
FROM SYS.TABLES 
WHERE OBJECT_ID IN (SELECT OBJECT_ID AS NAME 
        FROM SYS.COLUMNS 
        WHERE NAME LIKE '%ARCHIVEID%') 
    AND NAME <> 'EDSARCHIVEHISTORY' 
ORDER BY NAME 
EXEC(@sql) 
Verwandte Themen