2017-08-21 53 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 –

回答

相关问题