动态存储过程 按列标题排序
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'
我想按列标题对一个动态存储过程的结果进行排序。
比如我的存储过程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'