Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 T-SQL视图子查询Where子句_Sql Server 2008_Tsql_Views_Subquery - Fatal编程技术网

Sql server 2008 T-SQL视图子查询Where子句

Sql server 2008 T-SQL视图子查询Where子句,sql-server-2008,tsql,views,subquery,Sql Server 2008,Tsql,Views,Subquery,我想看看这是否可能。我正在构建一个需要有子查询的视图。但是,子查询需要与主SQL语句具有相同的where子句 我需要把它放在一个视图中,因为我必须从另一个表和存储过程进行连接,在我的情况下,表UDF也不能工作 我构建了以下示例来说明我正在尝试做什么: IF OBJECT_ID('tempdb..#TableA') IS NOT NULL BEGIN DROP TABLE #TableA END IF OBJECT_ID('tempdb..#TableB') IS NOT NULL BEGIN D

我想看看这是否可能。我正在构建一个需要有子查询的视图。但是,子查询需要与主SQL语句具有相同的where子句

我需要把它放在一个视图中,因为我必须从另一个表和存储过程进行连接,在我的情况下,表UDF也不能工作

我构建了以下示例来说明我正在尝试做什么:

IF OBJECT_ID('tempdb..#TableA') IS NOT NULL BEGIN DROP TABLE #TableA END
IF OBJECT_ID('tempdb..#TableB') IS NOT NULL BEGIN DROP TABLE #TableB END

Create Table #TableA
(
    Id INT IDENTITY(1, 1)
    , ValueA VARCHAR(10)
)

Create Table #TableB
(
    Id INT IDENTITY(1, 1)
    , TableAID INT
    , ValueB VARCHAR(10)
)

INSERT INTO #TableA VALUES ('Company A'), ('Company B')

INSERT INTO #TableB VALUES (1, '05001'), (1, '05002')
INSERT INTO #TableB VALUES (2, '04001'), (2, '04003')

SELECT
    DISTINCT
    A.ValueA
    , STUFF((SELECT 
                ', ' + B.ValueB
            FROM 
                #TableB B 
            INNER JOIN #TableA A on A.Id = B.TableAID
            WHERE 
                B.ValueB IN ('05001', '05002') --This needs to be part of the main where clause
            FOR XML PATH ('')), 1, 1, '') as TBValue

FROM
    #TableA A
INNER JOIN #TableB B on B.TableAID = A.Id
WHERE
    B.ValueB IN ('05001', '05002') --This will be passed in as the where clause for the View

IF OBJECT_ID('tempdb..#TableA') IS NOT NULL BEGIN DROP TABLE #TableA END
IF OBJECT_ID('tempdb..#TableB') IS NOT NULL BEGIN DROP TABLE #TableB END
上述示例的输出为我们提供了以下信息:

ValueA     TBValue 
Company A  05001, 05002 

我需要能够使子查询使用与主where子句相同的值,或者重建查询,以便以某种方式为子数据使用主where子句

不能将参数传递到视图中。它们不是为接受它们而设计的。我认为在这种情况下需要使用表值(内联表)函数。这将允许您传入所需的值并返回“表”

您应该能够使用已经为视图编写的相同代码,只需对函数做一些小的更改。您必须声明传入变量和传出表值

CREATE FUNCTION tvf_SomeFunction 
(   
    -- Add the parameters for the function here
    @Value1 varchar(10), 
    @Value2 varchar(10)
)
RETURNS TABLE 
AS
RETURN 

        DECLARE @TableA TABLE
    (
        Id INT IDENTITY(1, 1)
        , ValueA VARCHAR(10)
    )

    DECLARE @TableB TABLE
    (
        Id INT IDENTITY(1, 1)
        , TableAID INT
        , ValueB VARCHAR(10)
    )

    INSERT INTO @TableA VALUES ('Company A'), ('Company B')

    --INSERT INTO @TableB VALUES (1, '05001'), (1, '05002')
    --INSERT INTO @TableB VALUES (2, '04001'), (2, '04003')

    SELECT
        DISTINCT
        A.ValueA
        , STUFF((SELECT 
                    ', ' + B.ValueB
                FROM 
                    @TableB B 
                INNER JOIN @TableA A on A.Id = B.TableAID
                WHERE 
                    B.ValueB IN (@Value1, @Value2) --This needs to be part of the main where clause
                FOR XML PATH ('')), 1, 1, '') as TBValue

    FROM
        @TableA A
    INNER JOIN @TableB B on B.TableAID = A.Id
    WHERE
        B.ValueB IN (@Value1, @Value2) --This will be passed in as the where clause
    )
    GO
您的最终SQL将非常简单,如下所示:

SELECT *
FROM tvf_SomeFunction('05001', '05002')

请忽略我对你原创文章的编辑。我错误地编辑了你原来的帖子。嗯,这是我一直在想的,但我永远不知道。哦,好吧。这就是生活:-)。谢谢。是的,我在一个非常相似的场景中得出了相同的结论-到目前为止唯一的方法是通过表值自定义项