2017-08-21 3 views
0

Entschuldigung dafür scheint wie eine Frage, die zuvor gestellt wurde, aber nichts schien bei meinen Recherchen anwendbar. In einer älteren SQL Server-Datenbank, an der ich gerade arbeitete, stieß ich auf eine Ansicht in einer zentralen Datenbank, die Initialen für Teilnehmer in nachfolgenden projektspezifischen Datenbanken (namens rpt.SubjectInitials) erstellen sollte, die eine Reihe von Unionen verwendeten und musste daher ständig aktualisiert werden.SQL Server - Verwenden gespeicherter Prozedur Ergebnisse in einer Ansicht

Ex.

Offensichtlich verursachte dies Probleme, wann immer ein neues Projekt online ging und alte Projekte in den Ruhestand gingen. Ich habe eine gespeicherte Prozedur erstellt, die dynamisch alle aktiven Projekte durchläuft und die erforderlichen Informationen aus den oben genannten Ansichten von "vwMergeLetterFields" in den Projekten abruft. Die gespeicherte Prozedur verwendet einen Cursor und fügt die Ergebnisse in eine temporäre Tabelle ein und führt am Ende eine Auswahl aus, um die Ergebnisse zu erhalten.

Ex.

CREATE PROCEDURE [dbo].[usp_SubjectInitials] 
AS 
Begin 

Declare @Projectname as nvarchar(20) 
DECLARE @fName as nvarchar(max) 

IF OBJECT_ID('tempdb..#TblWData')Is Not Null Drop Table #TblWData 
CREATE TABLE [dbo].[#TblWData](SubjectID int, FirstName nvarchar(50), MiddleInitial nvarchar(10), LastName nvarchar(50), Initials nvarchar(10), Project nvarchar(25)) ON [PRIMARY] 


--Declares the cursor and gives it a name 
DECLARE SubjectInitials CURSOR 

LOCAL SCROLL STATIC 

FOR 

SELECT dbname FROM [Assessments].[dbo].[rtblProject] 
    where active = 1 and project > 1 

--Executes the cursor 
OPEN SubjectInitials 

FETCH NEXT FROM SubjectInitials 

    INTO @Projectname 

WHILE @@FETCH_STATUS = 0 

BEGIN 

set @fname = 'IF(EXISTS(SELECT * FROM ' + @Projectname +'.INFORMATION_SCHEMA.Views WHERE TABLE_SCHEMA = ''dbo'' AND TABLE_NAME = ''vwMergeLetterFields'')) 
BEGIN 
insert into #TblWData(SubjectID, FirstName, MiddleInitial, LastName, Initials, Project) 
SELECT  distinct SubjectID, FirstName, MiddleInitial, LastName, Initials, Project 
FROM   ' + @Projectname +'.dbo.vwMergeLetterFields 
WHERE  (SubjectID IS NOT NULL) 
END' 


exec sp_executesql @fname 

--Tells the cursor to move on to the next line in the results (i.e. the next table) 
FETCH NEXT FROM SubjectInitials 

    INTO @Projectname 
    -- PRINT @Projectname 
END 

--close the cursor 
CLOSE SubjectInitials 

--Closes the cursor 
DEALLOCATE SubjectInitials 

End 

select * from #TblWData 

Ich weiß, dass ein Cursor mit allgemein verpönt, aber wir haben Projekte gehen aktiv und inaktiv regelmäßig und sie fast alle eine Vielzahl von Funktionen teilen (ich bin zu Code offen, die dynamisch zieht/updates Daten). Leider funktioniert der obige Code für die meisten Teile des Systems, die Daten aus dieser Datenbank abrufen, aber nicht für die Ansichten, die auf die ursprüngliche Ansicht verweisen (rpt.SubjectInitials).

Also mein Problem läuft darauf hinaus: Ich muss in der Lage sein, die Ergebnisse der gespeicherten Prozedur in ein Formular zu erhalten, das in den Ansichten verwendet werden kann, die auf rpt.SubjectInitials verweisen. Ich habe durchgesehen: http://www.sommarskog.se/share_data.html und kann wirklich nicht finden, wie man meinen Code mit irgendwelchen der vorgeschlagenen Lösungen arbeiten lässt. Jede weitere Anleitung wäre ein Lebensretter.

Danke

+0

Werfen Sie einen Blick auf benutzerdefinierte Funktionen mit Tabellenwerten. Sie ermöglichen programmatische Logik und geben eine Tabelle zurück, die in einer Ansicht verwendet werden kann. Ihre Ansicht kann dann aus der Funktion auswählen. Dieser Microsoft-Artikel erläutert ausführlicher. https://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx –

Antwort

Verwandte Themen