This website requires JavaScript.

SQL Server: 高级T-SQL之使用APPLY操作符

APPLY 操作符介绍

你是否想过,写个SELECT 语句来调用表值函数或者一个计算表值的表达式?如果是这样,那么你会很高兴知道使用APPLY来实现需求. APPLY操作符有两种格式

第一个是CROSS APPLY . 该格式把记录集或者表的列值带入到另一个表值函数或者表达式 然后返回每个值处理的结果.

第二个是OUTER APPLY. 这个操作符与CROSS APPLY很相似,不同的是,如果带入的值未返回结果,该值仍然显示.

更好的理解这两个APPLY 格式就是实践.让我们用一些例子看看这两者的不同

测试数据及函数

USE tempdb;
GO
IF object_id('dbo.Product') IS NOT NULL 
    DROP TABLE dbo.Product;
IF object_id('dbo.SearchString') IS NOT NULL 
    DROP TABLE dbo.SearchString;
IF object_id('dbo.FindProductLike') IS NOT NULL
    DROP FUNCTION dbo.FindProductLike;

CREATE TABLE dbo.Product
    (
      ID INT IDENTITY ,
      ProductName VARCHAR(100) ,
      Price MONEY
    );
INSERT  INTO dbo.Product
VALUES  ( 'Red Santa Suit', 199.99 ),
        ( 'Candy Canes', 1.99 ),
        ( 'Fake Snow', 2.99 ),
        ( 'Red Bells', 49.99 ),
        ( 'LED Lights', 6.99 );

CREATE TABLE dbo.SearchString
    (
      ID INT IDENTITY ,
      String VARCHAR(100)
    );

INSERT  INTO dbo.SearchString
VALUES  ( 'Red' ),
        ( 'Lights' ),
        ( 'Star' );
GO

CREATE FUNCTION dbo.FindProductLike
    (
      @FindString VARCHAR(100)
    )
RETURNS TABLE
AS
RETURN
    ( SELECT    ProductName ,
                Price
      FROM      dbo.Product
      WHERE     ProductName LIKE '%' + @FindString + '%'
    )

使用CROSS APPLY 操作符

USE tempdb;
GO
SELECT  *
FROM    dbo.SearchString AS S
        CROSS APPLY dbo.FindProductLike(S.String);

返回结果

image

使用 OUT APPLY 操作符

USE tempdb;
GO
SELECT  *
FROM    dbo.SearchString AS S
        OUTER APPLY dbo.FindProductLike(S.String);

返回结果如下,Star带入到表值函数并未返回值,但是我们结果中还是有Star这行.

image

使用表值表达式

USE tempdb;
GO
SELECT * FROM dbo.SearchString as S
	CROSS APPLY 
	(SELECT ProductName, Price
    FROM dbo.Product 
	WHERE ProductName like '%' + S.String + '%') as X

结果一样,只是我们用表达式代替的表值函数

image

参考

本文只是精简了一下Stairway to Advanced T-SQL Level 2: Using the APPLY Operator 这篇文章,如果你本身对SQL Server不是特别了解可以看这篇原文.

0条评论
avatar