如何在T-sql中将多行生成为一列值或逗号分隔的sql语句
我在数据库中有一个表(表1),其中存储了上述值 注:- I.为有序列:2-->说明;1-->Asc;0-->默认值 二,序列ID列:列名“顺序依据”序列 这些值由用户存储在上表中(即在用户界面上)。我想用逗号“,”separated(一列)将多行中的“orderby”子句生成为单个语句 例如:从表1中选择*按DEF asc、ABC desc、MNO asc、JKL asc排序 在这里,我想编写一条sql语句,只生成上面所示的order by语句如何在T-sql中将多行生成为一列值或逗号分隔的sql语句,sql,sql-server,sql-server-2005,tsql,sql-server-express,Sql,Sql Server,Sql Server 2005,Tsql,Sql Server Express,我在数据库中有一个表(表1),其中存储了上述值 注:- I.为有序列:2-->说明;1-->Asc;0-->默认值 二,序列ID列:列名“顺序依据”序列 这些值由用户存储在上表中(即在用户界面上)。我想用逗号“,”separated(一列)将多行中的“orderby”子句生成为单个语句 例如:从表1中选择*按DEF asc、ABC desc、MNO asc、JKL asc排序 在这里,我想编写一条sql语句,只生成上面所示的order by语句,即(order by DEF asc、ABC de
,即(order by DEF asc、ABC desc、MNO asc、JKL asc)
这里您会注意到,GHI列和PQR列不包括在内,因为在用户界面中,这两个列没有按顺序选择
我提前感谢您试图理解我的问题并给出了相应的解决方案。希望这能有所帮助
ColumnName IsOrdered Seq_ID
ABC 2 2
DEF 1 1
GHI 0 NULL
JKL 1 4
MNO 1 3
PQR 0 5
DECLARE@OrderBySetting VARCHAR(max)=”
声明@OrderByString VARCHAR(max)=”
声明我的光标
对于选择ColumnName+“”+
病例排序
当1时,则“ASC”
当2时,则“DESC”
结束
+ ','
来自表1
其中(按0排序)
按顺序ID说明订购
打开我的鼠标
从我的_光标获取下一个到@OrderBySetting
而@@FETCH\u STATUS=0
开始
设置@OrderByString=@OrderBySetting+@OrderByString
从我的_光标获取下一个到@OrderBySetting
结束
关闭我的鼠标
取消分配我的光标
SET@OrderByString='从表1中选择*按'+子字符串(@OrderByString,1,LEN(@OrderByString)-1排序
给你(可能需要添加演员阵容)
您好,gbn,感谢您快速提供解决方案。IsIncluded列我在报告中实际使用的条件是检查此值是否为0,然后隐藏该列。这是我的错,我刚搬走。谢谢。嗨,Raymund,+1为我提供了非常快速的解决方案。谢谢由于它是基于光标的,从性能上看可能有点慢。
DECLARE @OrderBySetting VARCHAR(max) = ''
DECLARE @OrderByString VARCHAR(max) = ''
DECLARE MY_CURSOR CURSOR
FOR SELECT ColumnName + ' ' +
case IsOrdered
WHEN 1 THEN 'ASC'
WHEN 2 THEN 'DESC'
END
+ ','
FROM Table1
WHERE (IsOrdered <> 0)
ORDER BY Seq_ID DESC
OPEN My_Cursor
Fetch NEXT FROM MY_Cursor INTO @OrderBySetting
WHILE @@FETCH_STATUS = 0
BEGIN
SET @OrderByString = @OrderBySetting + @OrderByString
FETCH NEXT FROM MY_Cursor INTO @OrderBySetting
END
CLOSE MY_Cursor
DEALLOCATE MY_Cursor
SET @OrderByString = 'SELECT * FROM TABLE1 ORDER BY ' + SUBSTRING(@OrderByString, 1, LEN(@OrderByString)-1)
SELECT
'ORDER BY ' +
SUBSTRING(
(
SELECT
',' + ColumnName +
CASE IsOrdered
WHEN 1 THEN 'ASC'
WHEN 2 THEN 'DESC'
END
FROM
MyTable
WHERE
IsOrdered > 0 -- why have "IsIncluded" column ?
ORDER BY
Seq_ID
FOR XML PATH ('')
)
, 2, 7999)