2017-07-17 62 views
0

我有一个时态表EmployeeEmployeeHistory作为它的历史表。C#SqlConnection查询时态表

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

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

这引发错误:

Incorrect syntax near FOR

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

+0

你能与发生异常的截图更新您的文章?另外,请包括'Conn'变量的声明和实例化的源代码。 – mjwills

+0

你能用SQL Server执行这样的命令吗? –

+0

你连接的SQL Server版本是什么? –

回答

1

问题是你正在使用表别名e等错误。不要以为你可以使用表别名。将其更改为

select * from Employee FOR SYSTEM_TIME ALL WHERE Id=15 

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

看到这个相关的帖子,以及如果你的数据库是130级或Why does the FOR Clause not work with an alias in SQL Server 2016 with temporal tables?

+0

因此,如何使它与别名一起工作,我正在使用一个非常复杂的查询,我需要别名。 – TSR

+0

为什么你需要它(别名)@TSR? – mjwills

+0

所以,它工作,当我删除别名,而不是使用tablename.columnname引用它的列。奇怪的事情。 – TSR

0
SELECT name, compatibility_level FROM sys.databases; 

它只能工作更

0

如果妳真想使用别名,就像如果你的查询,如果相当复杂& ü要更好的格式,你可以这样做2个步骤,使用CTE:

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

select * 
from _data as d 

OR

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

select * 
from _data as d 
where d.Id=15 
1

只是为了澄清,如果你需要别名和SYSTEM_TIME,使用语法如下:

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

为什么这个答案比已经接受的更好? – altschuler

+1

Approved anwser表示您不能在一个语句中使用FOR SYSTEM_TIME和别名。我的anser澄清说,这是可能的 – veeroo

+0

太棒了,你应该编辑你的答案来澄清:) – altschuler