我有这张桌子:
ProjectHistory(
Id INT,
CreatedDate DateTime,
CreatedBy INT,
TableName NVARCHAR(100),
FieldName NVARCHAR(150),
Value NVARCHAR(MAX),
LookupTableName NVARCHAR(100),
LookupTableIdFieldName NVARCHAR(150),
LookupTableValueFieldName NVARCHAR(150)
)
此表包含项目的更改历史记录。所以它说明了哪个表从哪个字段改变了谁。如果我跟踪更改的字段来自查找表,我保存查找表名,ID字段名和值字段名(这是数据库的简化版本,实际数据库已经有了结构略有不同)。
插入此表时没有任何问题。问题是当我想向用户显示数据时,我想与查找表一起显示查找值而不是ID。
表格中的记录示例:
TableName FieldName Value LookupTableName LookupTableIdFieldName LookupTableValueFieldName
--------- --------- ----- --------------- ---------------------- -------------------------
"Project" "StatusId" 4 "ProjectStatuses" "StatusId" "StatusName"
我想知道查询此表的最佳和最有效的方法是什么,并为更改加载查找表值。例如,对于上述记录,我想显示StatusId为4的StatusName(如“Rejected”)以及CreatedBy和CreatedDate等其他审计值。
答案 0 :(得分:-1)
这是一种痛苦。动态sql:
declare @tc table (id int identity primary key, tbl varchar(20), lu varchar(20), luv int, col varchar(20));
insert into @tc values ('bid', 'auctionID', 1, 'BiddingPrice');
declare @tbl varchar(20);
declare @lu varchar(20);
declare @luv int;
declare @col varchar(20);
select @tbl = tbl, @col = col, @lu = lu, @luv = luv from @tc where id = 1;
declare @sql varchar(100) = 'select b.' + @col + ' ' +
'from ' + @tbl + ' b ' +
'where b.' + @lu + ' = ' + cast(@luv as varchar(10));
select @sql;
exec(@sql);
为什么在NVARCHAR(MAX)
使用Value
?那应该是int
。
为什么不将实际值存储在ProjectHistory
中并为自己省去很多麻烦?如果有人更改了查找表中的值,则项目历史记录不再有效。
另一个选择是只有一个带有复合键的查找表
masterlookupVarchar
id int composite
row int primary key
val varchar(100) not null