我可能只是需要帮助以获得我想要的最佳类型的程序,但这是我想要做的。 我需要返回一个从多个表变量派生的表,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
答案 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
它应该完全相同。
但是顺便说一下,如果你有可能,你的桌子有点大。我建议在一个包含多个步骤的过程中将其转换。
我希望这会对你有所帮助。