Sql-Server
從 sql server 表中動態選擇列
假設我有一個實際儲存記錄的表,看起來像
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;
或者類似的東西 - 我正在手機上寫這個……