加入到保存在列上的表名的表

时间:2018-03-17 10:31:58

标签: sql sql-server tsql

我有这张桌子:

    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等其他审计值。

1 个答案:

答案 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