我想按列标题对一个动态存储过程的结果进行排序。
例如,我的存储过程返回以下表:
╔══════╦════════╦════╦══════╦═════════════╦═════════════╦════════╗
║ name ║ family ║ id ║ type ║ description ║ create_date ║ row_no ║
╚══════╩════════╩════╩══════╩═════════════╩═════════════╩════════╝
现在,我想创建一个存储过程来执行这个动态存储过程,但是这次得到一个按列标题排序的结果,如下所示:
╔═════════════╦═════════════╦════════╦════╦══════╦════════╦══════╗
║ create_date ║ description ║ family ║ id ║ name ║ row_no ║ type ║
╚═════════════╩═════════════╩════════╩════╩══════╩════════╩══════╝
我建立了这个问题的答案,但我不确定我的方式是正确或简单的方式!
我能在下面的答案中简单地执行这件事吗?
编辑:
我的答案是不适用于XML
数据类型的列!因为OPENQUERY
不支持这一点。
发布于 2015-07-11 12:24:06
我创建了一个SP来执行以下命令步骤:
#TempTable
中tempdb.sys.[columns]
表中查找查询结果列,因为我的SP结果现在存储在临时表中。在测试项目中,我的动态SP名称是:TestDB.dbo.sp_TEST
。现在,Sorter 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)
发布于 2015-07-17 01:01:28
这里是我的例子,希望能对你有所帮助:
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'
https://stackoverflow.com/questions/31361478
复制