web-dev-qa-db-ja.com

SQLサーバーテーブルから動的に列を選択する

次のようなレコードを実際に格納するテーブルがあるとします

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のユーザーがログインし、テーブルInfoからのレポートを希望する場合、selectコマンドは次のようになります。

Select FirstName, LastName, Gender from dbo.Info

一方、ID 2のユーザーの場合、selectコマンドは

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

ユーザーが列をクライアント側から注文できるので、selectステートメントは動的でなければなりません。出来ますか?

5
Bhuban

動的SQLを使用します。ただし、SQLインジェクション攻撃を回避するには、sys.columnsに参加します。

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;

またはそのようなもの-私は私の電話でこれを書いています...

4
Rob Farley