2015-07-11 49 views
0

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

例如我的存储过程返回此表:

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

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

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

我创办这个问题的答案,但我不知道我的方法是正确的或简单的方法!

我可以轻松实现此事吗?

编辑:

我的回答是不被XML数据类型的列上工作!因为OPENQUERY不支持。

回答

0

我创建了一个SP做以下步骤顺序:

  • 1)将动态的SP导致成#TempTable

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

  • 3)分类成立列标题,并插入在字符串中由该图案:

    [COL1],[COL2],[COL3],...

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

    '选择' + '排序列:[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) 
2

这里是我的榜样,希望这有助于:

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'