Sql-Server

從 sql server 表中動態選擇列

  • July 18, 2015

假設我有一個實際儲存記錄的表,看起來像

Create Table dbo.Info
(
SN int primary key identity(1,1),
FirstName nvarchar(50) not null,
LastName nvarchar(50) not null,
Gender char(1) default 'M',
Age int check(Age>0)
)

現在出於報告目的,我只需要這個表列名並保存在另一個表中

Create Table Report.InfoColumnOrder
(
SN int primary key identity(1,1),
UserId int,
ColumnName nvarchar(100)
)

因此記錄看起來像

1, 1, FirstName
2, 1, LastName
3, 1, Gender
4, 2, LastName
5, 2, FirstName
6, 2, Age
7, 2, Gender

現在,當 id 為 1 的使用者登錄並希望從表資訊選擇命令中報告時,應該如下所示

Select FirstName, LastName, Gender from dbo.Info

而對於 id 2 的使用者,選擇命令將是

Select LastName, FirstName, Age, Gender from dbo.Info

因為,使用者可以從客戶端選擇語句排序列應該是動態的。可能嗎?

使用動態 SQL。但加入 sys.columns 以避免 SQL 注入攻擊。

DECLARE @qry NVARCHAR(MAX) =
'SELECT ' + STUFF((
   SELECT ', ' + QUOTENAME(c.name) 
   FROM Report.InfoColumnOrder r
   JOIN sys.columns c ON c.name = r.ColumnName AND c.object_id = object_id('dbo.Info')
   WHERE u.UserId = @user
   ORDER BY r.SN
   FOR XML PATH(''), TYPE).value('.','nvarchar(max)'),1,2,'') +
' FROM dbo.Info'
;
EXEC sp_executesql @qry, N'@user int', @user = @userid;

或者類似的東西 - 我正在手機上寫這個……

引用自:https://dba.stackexchange.com/questions/107424