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
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 –