2015-07-11 74 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'