【问题标题】:C# SqlConnection Querying Temporal tablesC# SqlConnection 查询临时表
【发布时间】:2017-07-17 12:19:04
【问题描述】:

我有一个临时表 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 查询时态表的历史数据?

【问题讨论】:

  • 您能否更新您的帖子并使用发生异常的屏幕截图?另外,请附上Conn变量的声明和实例化的源代码。
  • 你可以使用 SQL Server 执行这样的命令吗?
  • 你连接的是什么版本的 SQL Server?
  • 我意识到,当为 Employee 表指定别名时,此查询在 SQL Server 中也不起作用,但在没有别名的情况下也能正常工作,这很奇怪。即“select * from Employee FOR SYSTEM_TIME ALL WHERE Id=15 有效。
  • 不要认为你可以使用表别名。将其更改为select * from Employee FOR SYSTEM_TIME ALL WHERE Id=15

标签: c# sql-server sqlconnection temporal temporal-tables


【解决方案1】:

问题是您使用的是表别名e,因此出现错误。不要认为您可以使用表别名。把它改成

select * from Employee FOR SYSTEM_TIME ALL WHERE Id=15 

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

也请参阅此相关帖子Why does the FOR Clause not work with an alias in SQL Server 2016 with temporal tables?

【讨论】:

  • 那么,如何使它与别名一起使用,我在需要别名的地方使用了一个非常复杂的查询。
  • 你为什么需要它(别名)@TSR?
  • 所以,当我删除别名时,它可以工作,而是使用 tablename.columnname 来引用它的列。奇怪的事情。
  • 使用别名只是为了让事情变得简单易读,而不是使用表名。
  • 唉,你不能在这种情况下使用它们@TSR。
【解决方案2】:

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

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

【讨论】:

  • 为什么这个答案比已经接受的答案有所改进?
  • Approved anwser 说您不能在一个语句中使用 FOR SYSTEM_TIME 和别名。我的分析器澄清了这是可能的
  • 太好了,你应该编辑你的答案来澄清:)
【解决方案3】:
SELECT name, compatibility_level FROM sys.databases;

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

【讨论】:

    【解决方案4】:

    如果您真的想使用别名,例如如果您的查询非常复杂并且您想要更好的格式,您可以使用 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 
    

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2013-02-07
      • 2015-01-20
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多