1

我有一个临时表Employee作为EmployeeHistory它的历史表。

在 C# 中,我使用SqlConnection从 SQL Server 查询数据以获取员工的整个历史记录。

var data = Conn.ExecuteReader("select * from Employee e FOR SYSTEM_TIME ALL WHERE e.Id=15");

这会引发错误:

FOR附近的语法不正确

那么,我们如何使用 C# 查询时态表的历史数据SqlConnection

4

4 回答 4

3

问题是您正在使用表别名e,因此出现错误。不要认为您可以使用表别名。将其更改为

select * from Employee FOR SYSTEM_TIME ALL WHERE Id=15 

如果您查看Querying Data in a System-Versioned Temporal Table (OR) Temporal Tables文档,您将看到语法根本没有显示表别名的使用。相反,您将不得不使用整个表名。

另请参阅此相关帖子为什么 FOR 子句不适用于 SQL Server 2016 中的别名与临时表?

于 2017-07-17T12:34:50.557 回答
3

澄清一下,如果您需要别名和 FOR SYSTEM_TIME,请使用以下语法:

var data = Conn.ExecuteReader("select * from Employee FOR SYSTEM_TIME ALL e WHERE e.Id=15");
于 2017-08-30T13:57:01.793 回答
0
SELECT name, compatibility_level FROM sys.databases;

仅当您的数据库级别为 130 或更高时才有效

于 2017-07-17T12:36:24.617 回答
-1

如果您真的想使用别名,例如如果您的查询非常复杂并且您想要更好的格式,您可以使用 CTE 分两步执行此操作:

with _data as
(
    select * 
    from Employee 
    for system_time all 
    where Id=15 
)

select *
from _data as d

或者

with _data as
(
    select * 
    from Employee 
    for system_time all 
)

select *
from _data as d
where d.Id=15 
于 2017-07-17T12:52:04.653 回答