动态存储过程 按列标题排序

Dynamic stored procedures Order by Columns Title

我想按列标题对一个动态存储过程的结果进行排序。

比如我的存储过程returns这个table:

╔══════╦════════╦════╦══════╦═════════════╦═════════════╦════════╗
║ name ║ family ║ id ║ type ║ description ║ create_date ║ row_no ║
╚══════╩════════╩════╩══════╩═════════════╩═════════════╩════════╝

现在,我想创建一个存储过程来执行该动态存储过程,但这次得到按列标题排序的结果,如下所示:

╔═════════════╦═════════════╦════════╦════╦══════╦════════╦══════╗
║ create_date ║ description ║ family ║ id ║ name ║ row_no ║ type ║
╚═════════════╩═════════════╩════════╩════╩══════╩════════╩══════╝

我创建了这个问题的答案,但我不确定我的方法是否正确或简单!

我可以比下面的答案更容易实现这个问题吗?

编辑:

我的回答不适用于 XML 数据类型的列!因为OPENQUERY不支持那个。

我创建了一个 SP 来执行以下订购步骤:

  • 1) 将动态 SP 结果插入 #TempTable

  • 2) 在 tempdb.sys.[columns] table 中查找我的查询结果列,因为我的 SP 结果现在存储在临时 table.

  • 3) 对 Founded 列标题进行排序并按此模式将其插入字符串中:

    [col1], [col2], [col3], ...

  • 4) 创建一个T-SQL这个模型:

    'SELECT ' + 'sorted columns: [col1], [col2], [col3], ... ' + ' FROM ' + '#temptable'

  • 5) 执行创建 T-SQL 以显示排序的 SP 结果。

在测试项目中,我的动态SP名称是:TestDB.dbo.sp_TEST。 现在分拣机 SP 代码为:

/*
 * Run Just Once Time For Set Configures and Create Linked Server
 */
-- Set Permissions to insert into a temp table
--sp_configure 'Show Advanced Options', 1
--GO
--RECONFIGURE
--GO
--sp_configure 'Ad Hoc Distributed Queries', 1
--GO
--RECONFIGURE
--GO

--EXEC sp_addlinkedserver 
--     @server = 'LOCALSERVER',
--     @srvproduct = '',
--     @provider = 'SQLNCLI',
--     @datasrc = 'Localhost'



DECLARE @tbl     VARCHAR(MAX) = '#SortedColsTempTable',
        @sql     VARCHAR(MAX)

-- If old temp table is exist then clear that
IF OBJECT_ID('tempdb..#SortedColsTempTable') IS NOT NULL
    DROP TABLE #SortedColsTempTable

-- Insert your results into #SortedColsTempTable temp table's
SELECT * INTO #SortedColsTempTable
FROM   OPENQUERY([LOCALSERVER], 'EXEC TestDb.dbo.sp_TEST 1') 

-- Create a string by sorted columns title
SET @sql = (
        SELECT '[' + c.name + '], ' AS [text()]
        FROM   tempdb.sys.[columns] c
               INNER JOIN tempdb.sys.tables t
                    ON  t.[object_id] = c.[object_id]
        WHERE  t.name LIKE '#SortedColsTempTable%'
        ORDER BY
               c.name
               FOR XML PATH('')
    )

SET @sql = 'SELECT ' + LEFT(@sql, LEN(@sql) -1) + ' FROM ' + @tbl

EXEC (@sql)

这是我的示例,希望对您有所帮助:

CREATE TABLE [dbo].[Test](
    [text1] [nvarchar](500) NULL,
    [text4] [nvarchar](500) NULL,
    [text3] [nchar](10) NULL
) ON [PRIMARY]

GO
create proc sp_TableOrderBy 
@tableName varchar(100)
as
declare @sql nvarchar(max)
declare @tableColOrderBy nvarchar(max)
SELECT @tableColOrderBy = COALESCE(@tableColOrderBy + ', ', '') + Name
FROM sys.columns
WHERE object_id = OBJECT_ID(@tableName)
order by name
set @sql = 'select ' + @tableColOrderBy + ' from ' + @tableName
execute sp_executesql @sql

exec sp_TableOrderBy 'Test'