对于这种看起来像一个以前已经问过的问题的道歉,但似乎没有什么东西在我的搜索中适用。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 –