我有一个StudentMarks
带有列的表Name, Maths, Science, English
.数据就像
Name, Maths, Science, English
Tilak, 90, 40, 60
Raj, 30, 20, 10
Run Code Online (Sandbox Code Playgroud)
我希望得到如下安排:
Name, Subject, Marks
Tilak, Maths, 90
Tilak, Science, 40
Tilak, English, 60
Run Code Online (Sandbox Code Playgroud)
使用unpivot,我可以正确获取Name,Marks,但无法将源表中的列名称获取到Subject
所需结果集中的列.
我怎样才能做到这一点?
我到目前为止已达到以下查询(获取名称,标记)
select Name, Marks from studentmarks
Unpivot
(
Marks for details in (Maths, Science, English)
) as UnPvt
Run Code Online (Sandbox Code Playgroud) 我需要在SQL Server 2005数据库中的两个表上实现更改跟踪.我需要审核添加,删除,更新(详细了解更新内容).我正计划使用触发器来执行此操作,但在Google上进行搜索后,我发现错误地执行此操作非常容易,而且我想在开始时避免使用它.
任何人都可以发布更新触发器的示例,以优雅的方式成功完成此操作吗?我希望最终得到一个具有以下结构的审计表:
......但我愿意接受建议.
谢谢!
更新:使用Update_Columns()不是这个问题的答案,因为字段可能会按触发器的顺序更改(Update_Columns取决于列顺序).
更新2:我已经知道Deleted和Inserted表保存了数据.问题是如何确定已更改的内容而无需对字段名称进行硬编码,因为字段名称可能会更改,或者可能会添加字段.
可以说我有一个有三个字段的表.
该行已存在,现在用户更新字段1和2.
如何在更新触发器中确定更新字段的内容以及前后值的位置?
我想将这些记录到日志表中.如果有两个字段更新,则应在历史记录表中生成两行.
Table
Id intField1 charField2 dateField3
7 3 Fred 1995-03-05
Updated To
7 3 Freddy 1995-05-06
History Table
_____________
Id IdOfRowThatWasUpdated BeforeValue AfterValue (as string)
1 7 Fred Freddy
2 7 1995-03-05 1995-05-06
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用Deleted表来获取旧值,并使用inserted表来获取新值.然而,问题是如何动态地这样做.换句话说,实际的表有50列,我不想将50个字段硬编码到SQL语句中,如果字段发生变化,也不想担心保持SQL同步表格变化.
格雷格