次のようなレコードを実際に格納するテーブルがあるとします
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ステートメントは動的でなければなりません。出来ますか?
動的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;
またはそのようなもの-私は私の電話でこれを書いています...