如何在T-sql中将多行生成为一列值或逗号分隔的sql语句

如何在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

我在数据库中有一个表(表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 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)