【发布时间】:2018-05-26 11:03:30
【问题描述】:
我需要在存储过程的最后一个SELECT 语句中重新排序列。需要从另一个表中获取列顺序。
我有一个基于动态 SQL 的解决方案。有没有更好的方法呢?我有大约 100 列要返回,其中包含数百万行用于 Excel 导出。除了动态查询,还有其他性能优化方案吗?
请在下面找到我当前解决方案的示例代码。
IF OBJECT_ID( 'tempdb..#TempColumns') IS NOT NULL
BEGIN
DROP TABLE #TempColumns
END
IF OBJECT_ID( 'tempdb..#TempColumnsOrder') IS NOT NULL
BEGIN
DROP TABLE #TempColumnsOrder
END
CREATE TABLE #TempColumns
(
ID INT IDENTITY,
FirstName VARCHAR(MAX),
LastName VARCHAR(MAX),
Gender VARCHAR(MAX)
)
INSERT INTO #TempColumns
VALUES ('ABC', 'DEF', 'MALE'), ('PR', 'ZA', 'FEMALE'), ('ERT', 'GFG', 'MALE')
CREATE TABLE #TempColumnsOrder
(
ID INT IDENTITY,
ColumnName VARCHAR(MAX),
ColumnOrder INT
)
INSERT INTO #TempColumnsOrder
VALUES ('FirstName', 3), ('LastName', 2), ('Gender', 1)
SELECT * FROM #TempColumns
SELECT * FROM #TempColumnsOrder
DECLARE @script VARCHAR(MAX)
SELECT @script = 'SELECT '
SELECT @script = @script + ColumnName + ','
FROM #TempColumnsOrder
ORDER BY ColumnOrder
PRINT @script
SELECT @script = SUBSTRING(RTRIM(@script), 1, LEN(RTRIM(@script)) - 1)
SELECT @script = @script + ' FROM #TempColumns'
EXEC (@script)
IF OBJECT_ID( 'tempdb..#TempColumns') IS NOT NULL
BEGIN
DROP TABLE #TempColumns
END
IF OBJECT_ID( 'tempdb..#TempColumnsOrder') IS NOT NULL
BEGIN
DROP TABLE #TempColumnsOrder
END
【问题讨论】:
-
所有 T-SQL 解决方案都需要动态 SQL。另一种方法是在应用程序中排序/映射列。
-
感谢您的回复,除了我所做的之外,在动态 SQL 中还有什么更好的方法吗?
标签: sql sql-server sql-server-2012