• Jason A. Long - Wednesday, December 13, 2017 1:57 PM

    Try this...
    SET QUOTED_IDENTIFIER ON;
    GO
    SET ANSI_NULLS ON;
    GO
    CREATE PROCEDURE dbo.usp_Align
    /* =================================================================================================================================
    12/13/2017 JL, Created for forum post: https://www.sqlservercentral.com/Forums/1912528/ALIGNMENT
    ================================================================================================================================= */
    /*
    dbo.usp_Align
        @cnt = 25,
        @v_dir = 'D',
        @h_dir = 'R';
    */
        @cnt INT,
        @v_dir CHAR(1),
        @h_dir CHAR(1)
    AS
    BEGIN
        SET NOCOUNT ON;

        DECLARE @_output VARCHAR(8000) = '';

        WITH
            cte_n1 (n) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (n)),
            cte_n2 (n) AS (SELECT 1 FROM cte_n1 a CROSS JOIN cte_n1 b),
            cte_n3 (n) AS (SELECT 1 FROM cte_n2 a CROSS JOIN cte_n2 b),
            cte_Tally (rep_val) AS (
                SELECT TOP (@cnt)
                    ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
                FROM
                    cte_n3 a CROSS JOIN cte_n3 b
                ),
            cte_build_string AS (
                SELECT
                    t.rep_val,
                    pv.pad_val,
                    ov.output_val
                FROM
                    cte_Tally t
                    CROSS APPLY ( VALUES (@cnt - t.rep_val) ) pv (pad_val)
                    CROSS APPLY ( VALUES (
                                        REPLICATE(CASE WHEN @h_dir = 'L' THEN 'A' ELSE ' ' END, CASE WHEN @h_dir = 'L' THEN t.rep_val ELSE pv.pad_val END)
                                    +    REPLICATE(CASE WHEN @h_dir = 'R' THEN 'A' ELSE ' ' END, CASE WHEN @h_dir = 'R' THEN t.rep_val ELSE pv.pad_val END)
                                        ) ) ov (output_val)
                )
        SELECT
            @_output = (
                        SELECT
                            CONCAT(@_output, '||', bs.output_val)
                        FROM
                            cte_build_string bs
                        ORDER BY
                            CASE WHEN @v_dir = 'U' THEN bs.rep_val ELSE bs.pad_val END
                        FOR XML PATH('')
                        );

        PRINT(REPLACE(@_output, '||', CHAR(13) + CHAR(10)));
    END;
    GO

    Sample output...
    dbo.usp_Align
        @cnt = 10,
        @v_dir = 'U',
        @h_dir = 'L';
    -----------------------------------
    A   
    AA  
    AAA  
    AAAA  
    AAAAA 
    AAAAAA 
    AAAAAAA 
    AAAAAAAA
    AAAAAAAAA
    AAAAAAAAAA

    dbo.usp_Align
        @cnt = 10,
        @v_dir = 'D',
        @h_dir = 'L';
    -----------------------------------
    AAAAAAAAAA
    AAAAAAAAA
    AAAAAAAA
    AAAAAAA 
    AAAAAA 
    AAAAA 
    AAAA  
    AAA  
    AA  
    A   

    dbo.usp_Align
        @cnt = 10,
        @v_dir = 'U',
        @h_dir = 'R';
    ---------------------------------- (the raggedness is forum formatting)
       A
       AA
       AAA
      AAAA
      AAAAA
      AAAAAA
     AAAAAAA
    AAAAAAAA
    AAAAAAAAA
    AAAAAAAAAA

    dbo.usp_Align
        @cnt = 10,
        @v_dir = 'D',
        @h_dir = 'R';
    ---------------------------------- (the raggedness is forum formatting)
    AAAAAAAAAA
    AAAAAAAAA
    AAAAAAAA
     AAAAAAA
      AAAAAA
      AAAAA
      AAAA
       AAA
       AA
       A

    Hi Jason,
    This sp really work..Cool..thank you

    I do not understand about using 'With' and 'cte'