具有表变量的多语句表值函数

时间:2015-06-23 04:34:44

标签: sql-server

我可能只是需要帮助以获得我想要的最佳类型的程序,但这是我想要做的。 我需要返回一个从多个表变量派生的表,catch是我需要从SQL外部调用此表,因此不能直接使用表变量。所以我尝试使用表值函数。如果有一种方法可以在一个视图中完成所有这些而不使用表变量开始,那么更好但我无法找到一种方法来做到这一点。 理想情况下,我希望从外部SQL调用一个SELECT语句,将结果从以下语句中拉回来。

SELECT        Master.id, Master.SPName, DashCopyName, SRECopyName, TapeCopyName, DRCopyName

FROM            @Master AS Master LEFT OUTER JOIN
                     @TapeCopy AS TapeCopy ON Master.SPName = TapeCopy.SPName AND Master.id = TapeCopy.id LEFT OUTER JOIN
                     @DRCopy AS DRCopy ON Master.SPName = DRCopy.SPName AND Master.id = DRCopy.id LEFT OUTER JOIN
                     @SRECopy AS SRECopy ON Master.SPName = SRECopy.SPName AND Master.id = SRECopy.id LEFT OUTER JOIN
                     @DashCopy AS DashCopy ON Master.SPName = DashCopy.SPName AND Master.id = DashCopy.id
                     WHERE Master.id = @sp

所以这是我到目前为止的整个表值函数:

ALTER FUNCTION StoragePolicyCopies(@sp int)
RETURNS @ReturnTable TABLE (
id int,
SPName char(30), 
DashCopyName char(50), 
SRECopyName char(50), 
TapeCopyName char(50), 
DRCopyName char(50)
)
AS
BEGIN
DECLARE @DashCopy TABLE (
SPName char(30),
DashCopyName char(50),
id int)
INSERT INTO @DashCopy (SPName, DashCopyName, id)
SELECT        archGroup.name AS SPName, archGroupCopy_Dash.name AS DashCopyName, archGroup.id
FROM            commserv.dbo.archGroup AS archGroup LEFT OUTER JOIN
                     commserv.dbo.archGroupCopy AS archGroupCopy_Dash ON archGroup.id = archGroupCopy_Dash.archGroupId
WHERE        (archGroupCopy_Dash.name LIKE '%_Dash_Copy%') AND (archGroup.name NOT LIKE '%Global%')

DECLARE @DRCopy TABLE (
SPName char(30),
DRCopyName char(50),
id int)
INSERT INTO @DRCopy (SPName, DRCopyName, id)
SELECT        archGroup.name AS SPName, archGroupCopy_Dash.name AS DRCopyName, archGroup.id
FROM            commserv.dbo.archGroup AS archGroup LEFT OUTER JOIN
                     commserv.dbo.archGroupCopy AS archGroupCopy_Dash ON archGroup.id = archGroupCopy_Dash.archGroupId
WHERE        (archGroupCopy_Dash.name LIKE '%_DR%') AND (archGroup.name NOT LIKE '%Global%')

DECLARE @SRECopy TABLE (
SPName char(30),
SRECopyName char(50),
id int)
INSERT INTO @SRECopy (SPName, SRECopyName, id)
SELECT        archGroup.name AS SPName, archGroupCopy_Dash.name AS SRECopyName, archGroup.id
FROM            commserv.dbo.archGroup AS archGroup LEFT OUTER JOIN
            commserv.dbo.archGroupCopy AS archGroupCopy_Dash ON archGroup.id = archGroupCopy_Dash.archGroupId
WHERE        (archGroupCopy_Dash.name LIKE '%_Recover%') AND (archGroup.name NOT LIKE '%Global%')

DECLARE @TapeCopy TABLE (
SPName char(30),
TapeCopyName char(50),
id int)
INSERT INTO @TapeCopy (SPName, TapeCopyName, id)
SELECT        archGroup.name AS SPName, archGroupCopy_Dash.name AS TapeCopyName, archGroup.id
FROM            commserv.dbo.archGroup AS archGroup LEFT OUTER JOIN
            commserv.dbo.archGroupCopy AS archGroupCopy_Dash ON archGroup.id = archGroupCopy_Dash.archGroupId
WHERE        (archGroupCopy_Dash.name LIKE '%_Monthly_Tape%') AND (archGroup.name NOT LIKE '%Global%')

DECLARE @Master TABLE (
SPName char(30),
id int)
INSERT INTO @Master (SPName, id)
SELECT        name AS SPName, id
FROM            commserv.dbo.archGroup AS archGroup
WHERE        flags = 36 AND name NOT LIKE '%SEED%' AND name NOT LIKE '%ICO%'

INSERT INTO @ReturnTable
SELECT        Master.id, Master.SPName, DashCopyName, SRECopyName, TapeCopyName, DRCopyName
FROM            @Master AS Master LEFT OUTER JOIN
                     @TapeCopy AS TapeCopy ON Master.SPName = TapeCopy.SPName AND Master.id = TapeCopy.id LEFT OUTER JOIN
                     @DRCopy AS DRCopy ON Master.SPName = DRCopy.SPName AND Master.id = DRCopy.id LEFT OUTER JOIN
                     @SRECopy AS SRECopy ON Master.SPName = SRECopy.SPName AND Master.id = SRECopy.id LEFT OUTER JOIN
                     @DashCopy AS DashCopy ON Master.SPName = DashCopy.SPName AND Master.id = DashCopy.id
                     WHERE Master.id = @sp
RETURN 
END
GO

我的电话是:

USE [CommServ]
GO
SELECT * FROM [dbo].[StoragePolicyCopies] (5)
GO

1 个答案:

答案 0 :(得分:0)

就像快速拍摄一样。您可以使用SELECT将完整功能替换为单个CTE

;WITH DashCopy AS(
    SELECT archGroup.name AS SPName, archGroupCopy_Dash.name AS DashCopyName, archGroup.id
    FROM commserv.dbo.archGroup AS archGroup 
    LEFT OUTER JOIN commserv.dbo.archGroupCopy AS archGroupCopy_Dash 
        ON archGroup.id = archGroupCopy_Dash.archGroupId
    WHERE (archGroupCopy_Dash.name LIKE '%_Dash_Copy%') AND (archGroup.name NOT LIKE '%Global%')
), DRCopy AS(
    SELECT archGroup.name AS SPName, archGroupCopy_Dash.name AS DRCopyName, archGroup.id
    FROM commserv.dbo.archGroup AS archGroup 
    LEFT OUTER JOIN commserv.dbo.archGroupCopy AS archGroupCopy_Dash 
        ON archGroup.id = archGroupCopy_Dash.archGroupId
    WHERE (archGroupCopy_Dash.name LIKE '%_DR%') AND (archGroup.name NOT LIKE '%Global%')
), SRECopy AS(
    SELECT archGroup.name AS SPName, archGroupCopy_Dash.name AS SRECopyName, archGroup.id
    FROM commserv.dbo.archGroup AS archGroup 
    LEFT OUTER JOIN commserv.dbo.archGroupCopy AS archGroupCopy_Dash 
        ON archGroup.id = archGroupCopy_Dash.archGroupId
    WHERE (archGroupCopy_Dash.name LIKE '%_Recover%') AND (archGroup.name NOT LIKE '%Global%')
), TapeCopy AS(
    SELECT archGroup.name AS SPName, archGroupCopy_Dash.name AS TapeCopyName, archGroup.id
    FROM commserv.dbo.archGroup AS archGroup 
    LEFT OUTER JOIN commserv.dbo.archGroupCopy AS archGroupCopy_Dash 
        ON archGroup.id = archGroupCopy_Dash.archGroupId
    WHERE (archGroupCopy_Dash.name LIKE '%_Monthly_Tape%') AND (archGroup.name NOT LIKE '%Global%')
), Master AS(
    SELECT name AS SPName, id
    FROM commserv.dbo.archGroup AS archGroup
    WHERE flags = 36 AND name NOT LIKE '%SEED%' AND name NOT LIKE '%ICO%'
)
SELECT        Master.id, Master.SPName, DashCopyName, SRECopyName, TapeCopyName, DRCopyName
FROM            Master 
LEFT OUTER JOIN TapeCopy 
    ON Master.SPName = TapeCopy.SPName AND Master.id = TapeCopy.id 
LEFT OUTER JOIN DRCopy 
    ON Master.SPName = DRCopy.SPName AND Master.id = DRCopy.id 
LEFT OUTER JOIN SRECopy 
    ON Master.SPName = SRECopy.SPName AND Master.id = SRECopy.id 
LEFT OUTER JOIN DashCopy 
    ON Master.SPName = DashCopy.SPName AND Master.id = DashCopy.id
WHERE Master.id = 5

它应该完全相同。

但是顺便说一下,如果你有可能,你的桌子有点大。我建议在一个包含多个步骤的过程中将其转换。

我希望这会对你有所帮助。