• 用户自定义函数代替游标进行循环拼接


    首先,建立测试表,本例我们采用经典的Customer 1-->n Order结构,如下:

    代码
    USE test
    GO

    IF EXISTS (SELECT 1 FROM sysobjects WHERE name = 'Orders')
        
    DROP TABLE Orders
        
    IF EXISTS (SELECT 1 FROM sysobjects WHERE name = 'Customers')
        
    DROP TABLE Customers
        
    /*
        Customer 1 --> n Order
    */

    -- Create Customer Table
    CREATE TABLE Customers
    (
        CustomerId 
    UNIQUEIDENTIFIER PRIMARY KEY,
        Name 
    VARCHAR(25),
    )
    GO


    -- Create Order Table
    CREATE TABLE Orders
    (
        OrderId 
    UNIQUEIDENTIFIER PRIMARY KEY,
        Name 
    VARCHAR(255),
        Customer_Id 
    UNIQUEIDENTIFIER FOREIGN KEY REFERENCES Customers(CustomerId)
    )
    GO

    然后,插入一些测试数据:

    代码
    -- insert test data for customers table
    INSERT INTO Customers
    VALUES('65DC24EF-BA13-4707-95B0-3D426C2FD0A0','C1')

    INSERT INTO Customers
    VALUES('32AA5A01-39B4-42D0-BEE9-9AF64171EB55','C2')
    GO


    -- insert test data for orders table
    INSERT INTO Orders
    VALUES('8EAA07D0-0E04-412A-8A60-3178C9C2E205','O1 by C1','65DC24EF-BA13-4707-95B0-3D426C2FD0A0')

    INSERT INTO Orders
    VALUES('78E0CDAB-A3FA-4317-9D4E-D884F91D41A8','O2 by C2','32AA5A01-39B4-42D0-BEE9-9AF64171EB55')

    INSERT INTO Orders
    VALUES('D08038A9-94FB-4AFF-9E41-F8BEE0FD4384','O3 by C1','65DC24EF-BA13-4707-95B0-3D426C2FD0A0')

    INSERT INTO Orders
    VALUES('7487AE08-6313-4DB7-87D7-8F9204F07470','O4 by C2','32AA5A01-39B4-42D0-BEE9-9AF64171EB55')

    INSERT INTO Orders
    VALUES('49A76769-D074-4AF3-9707-751D34847E2A','O5 by C1','65DC24EF-BA13-4707-95B0-3D426C2FD0A0')

    INSERT INTO Orders
    VALUES('C5C055EB-49A7-4E4C-82EA-1DB10933C78D','O6 by C2','32AA5A01-39B4-42D0-BEE9-9AF64171EB55')

    GO

    建立自定义函数:

    代码
    IF EXISTS (SELECT 1 FROM sysobjects WHERE name = 'fnGetCustomerOrders')
        
    DROP FUNCTION fnGetCustomerOrders

    CREATE FUNCTION fnGetCustomerOrders
    (
        
    @CustomerName VARCHAR(25)
    )
        
    RETURNS VARCHAR(MAX)

    AS 

    BEGIN
        
    DECLARE @result VARCHAR(MAX)
        
    SET @result = ''
        
    SELECT @result = @result + '' + o.Name
        
    from Customers c INNER JOIN Orders o
                
    ON c.CustomerId=o.Customer_Id
        
    WHERE c.Name=@CustomerName
        
    ORDER by c.Name, o.Name

        
    IF @result like ', %'
            
    SET @result = right(@resultlen(@result- 2)

        
    RETURN @result
    END

    GO

    测试函数:

    -- test function
    DECLARE @customer_name VARCHAR(25)
    SET @customer_name='C1'
    SELECT 'Orders By ' + @customer_name + '' + dbo.fnGetCustomerOrders(@customer_name)

    GO

    结果如下:

    Orders By C1: O1 by C1, O3 by C1, O5 by C1

  • 相关阅读:
    攻防世界-web进阶-Web_php_include
    攻防世界-web进阶-php_rce
    Buuctf-misc-穿越时空的思念
    Buuctf-misc-[BJDCTF 2nd]EasyBaBa (kinovea)
    Buuctf-misc-菜刀666
    Buuctf-misc-[BJDCTF 2nd]圣火昭昭-y1ng(outguess)
    Access数据库简介
    VC与VB
    VB的使用
    工作总结2
  • 原文地址:https://www.cnblogs.com/davidgu/p/1737374.html
Copyright © 2020-2023  润新知