sql-server-2008 - T-SQL 查看子查询Where 子句

标签 sql-server-2008 t-sql view subquery

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

我需要在 View 中包含此内容,因为我必须从另一个表执行 JOIN,并且存储过程或表 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 子句。

最佳答案

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

您应该能够使用已为 View 编写的相同代码,并对函数进行细微更改。您必须声明传入变量和传出表值。

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')

关于sql-server-2008 - T-SQL 查看子查询Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617211/

相关文章:

Drupal 7 在 View 中获取分类术语列表

sql-server - SQL Server 2008 - sp_refreshview 对某些 View 的轰炸

sql - SQL SERVER 2008 R2 如何在单列中逐行显示多个值?

sql-server-2008 - 选择、修改和插入同一个表

sql - 如何在 SQL Server 中的 where 子句中比较 varbinary

sql-server - SQL错误地生成红色下划线

sql-server - 抛出错误的 T-SQL 函数

sql-server-2008 - 使用 Join、Group By 和having 进行更新

sql - 在 select 语句中设置参数

javascript - 如何使用 Backbone 停止在 touchstart 上触发 touchend 事件