2017-08-21 74 views
0

對於這種看起來像一個以前已經問過的問題的道歉,但似乎沒有什麼東西在我的搜索中適用。SQL Server - 在視圖中使用存儲過程結果

在我最近研究的遺留SQL Server數據庫中,我遇到了一箇中央數據庫中的一個視圖,該視圖旨在爲參與者在隨後的項目特定數據庫(名爲rpt.SubjectInitials)中爲參與者創建首字母,這些數據庫正在使用一系列聯合因此必須不斷更新。

Ex。

SELECT  SubjectID, FirstName, MiddleInitial, LastName, Initials, 1 AS Project 
FROM   Switch.dbo.vwMergeLetterFields 
WHERE  (SubjectID IS NOT NULL) 
UNION 
SELECT  SubjectID, FirstName, MiddleInitial, LastName, Initials, 2 AS Project 
FROM   Mars.dbo.vwMergeLetterFields 
WHERE  (SubjectID IS NOT NULL) 

很顯然,當一個新項目上線並且舊項目退役時,這會引發問題。我創建了一個存儲過程,動態地通過所有活動項目,並從項目中前述的「vwMergeLetterFields」視圖中提取必要的信息。存儲過程使用遊標並將結果插入臨時表中,並在結尾處運行select以獲取結果。

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 

我知道,使用光標在一般不贊成,但我們有項目定期去活躍和不活躍,他們幾乎都有着很多的功能(我打開動態拉/更新數據的代碼)。不幸的是,儘管上面的代碼適用於從該數據庫中提取數據的系統的大多數部分,但它不適用於引用原始視圖(rpt.SubjectInitials)的視圖。

所以我的問題歸結爲:我需要能夠將存儲過程的結果導入可用於引用rpt.SubjectInitials的視圖中的表單。我已經看過這個:http://www.sommarskog.se/share_data.html,真的找不到如何使我的代碼與任何建議的解決方案工作。任何進一步的指導將是一個救星。

謝謝

+0

查看錶值自定義函數。它們允許編程邏輯並返回一個可以在視圖中使用的表。您的視圖然後可以從該功能中選擇。這篇Microsoft文章更詳細地解釋。 https://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx –

回答

相關問題