Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 带表变量的多语句表值函数_Sql Server - Fatal编程技术网

Sql server 带表变量的多语句表值函数

Sql server 带表变量的多语句表值函数,sql-server,Sql Server,我可能只是需要最好的程序类型的帮助来获得我想要的,但这里是我正在尝试做的。 我需要返回一个从多个表变量派生的表。关键是我需要从SQL外部调用这个表,所以不能直接使用表变量。所以我尝试使用表值函数。如果有一种方法可以在视图中执行所有这些操作,而不使用表变量,那么效果会更好,但我无法找到一种方法。 因此,理想情况下,我希望使用一个从外部SQL调用的SELECT语句,从下面的语句中提取结果 SELECT Master.id, Master.SPName, DashCopyName, SR

我可能只是需要最好的程序类型的帮助来获得我想要的,但这里是我正在尝试做的。 我需要返回一个从多个表变量派生的表。关键是我需要从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

就像快速射击一样。您可以使用
CTE
将整个功能替换为一个
SELECT

;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
它也应该这样做

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


我希望这对你有帮助

你为什么不能使用存储过程呢?用这个来砸钱!!CTE是前进的方向,我不需要在我们的数据库中创建一个我试图避免的过程,我也尝试在开始时使用表变量,但它们在SQL之外不起作用。但我可以在SQL之外远程调用它,这是一种享受。给猫剥皮总是有一种简单和困难的方法,这种方法容易得多!谢谢很高兴听到这对您有帮助。:-)