對於這種看起來像一個以前已經問過的問題的道歉,但似乎沒有什麼東西在我的搜索中適用。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,真的找不到如何使我的代碼與任何建議的解決方案工作。任何進一步的指導將是一個救星。
謝謝
查看錶值自定義函數。它們允許編程邏輯並返回一個可以在視圖中使用的表。您的視圖然後可以從該功能中選擇。這篇Microsoft文章更詳細地解釋。 https://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx –