我在数据库中有一个由10列组成的表,每列的标题名称是
'Col'+列号
看起来像这样
id|Col1|Col2|Col3|Col4|Col5|Col6
我有一个SQL语句,它通过存储过程运行,将存储的列号作为参数
@ColumnNumber nvarchar(10)
我想做的就是按照将在参数中传递的列号排序结果,类似这样
Select * from [Table] order by ('Col' + @ColumnNumber)
但它不能与我合作
答案 0 :(得分:3)
您需要创建动态SQL以使其像
一样工作DECLARE @ColumnNumber nvarchar(10)
DECLARE @strSQL nvarchar(max)
SET @ColumnNumber = '1'
SET @strSQL = 'Select * from [Table] order by Col' + @ColumnNumber
EXEC(@strSQL)
更新: 如果你有XML类型的@List变量有多个id,那么你可以使用逗号分隔格式,如下面的
DECLARE @RecordIds nvarchar(max)
DECLARE @List XML = '<Records><id>1</id></Records><Records><id>2</id></Records>'
SELECT @RecordIds = STUFF((SELECT ',' + RecordId.value('.','varchar(5)')
FROM @List.nodes('Records/id') AS Test(RecordId)
FOR XML PATH (''))
, 1, 1, '')
然后您可以在查询中使用逗号分隔的字符串,如
SET @strSQL = 'Select * from [Table] where Id in ( ' + @RecordIds + ' ) order by Col' + @ColumnNumber
答案 1 :(得分:3)
试试这个 -
DECLARE @ColumnNumber INT
SET @ColumnNumber = 1
SELECT *
FROM [Table]
ORDER BY
CASE @ColumnNumber
WHEN 1 THEN Col1
WHEN 2 THEN Col2
WHEN 3 THEN Col3
END
答案 2 :(得分:3)
不使用动态SQL,您可以使用CASE语句执行此操作:
SELECT * FROM [Table]
ORDER BY CASE @ColumnNumber
WHEN 1 THEN Col1
WHEN 2 THEN Col2
WHEN 3 THEN Col3
.....
WHEN 10 THEN Col10
END;
答案 3 :(得分:0)
试试这个 -
DECLARE @ColumnNumber NVARCHAR(10)
DECLARE @sql NVARCHAR(100)
SET @ColumnNumber = '1'
SET @sql = 'Select * from TEST_EXISTS order by COL' + @ColumnNumber + ' DESC'
PRINT @sql
EXEC (@SQL)