Bhu*_*ban 5 sql-server-2008 sql-server sql-server-2008-r2 c#
假设我有一个实际存储记录的表,它看起来像
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)
)
Run Code Online (Sandbox Code Playgroud)
现在为了报告目的,我只需要这个表列名并保存在另一个表中
Create Table Report.InfoColumnOrder
(
SN int primary key identity(1,1),
UserId int,
ColumnName nvarchar(100)
)
Run Code Online (Sandbox Code Playgroud)
因此记录看起来像
1, 1, FirstName
2, 1, LastName
3, 1, Gender
4, 2, LastName
5, 2, FirstName
6, 2, Age
7, 2, Gender
Run Code Online (Sandbox Code Playgroud)
现在,当 id 为 1 的用户登录并希望从表 Info select 命令中获取报告时,应如下所示
Select FirstName, LastName, Gender from dbo.Info
Run Code Online (Sandbox Code Playgroud)
而对于 id 为 2 的用户,选择命令将是
Select LastName, FirstName, Age, Gender from dbo.Info
Run Code Online (Sandbox Code Playgroud)
因为,用户可以从客户端选择语句订购列应该是动态的。是否可以?
使用动态 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;
Run Code Online (Sandbox Code Playgroud)
或者类似的东西 - 我正在手机上写这个......