【问题标题】:Analog to MS Access WITH statement in MS SQL Server?类似于 MS SQL Server 中的 MS Access WITH 语句?
【发布时间】:2018-09-23 20:38:11
【问题描述】:

我有一个名称很长的链接服务器。我有一个需要执行的存储过程,它需要来自该服务器的表。我不想一遍又一遍地输入服务器名称,因为它会使代码看起来相当难看。我喜欢 MS Access VBA With 块之类的东西,或者完成同样事情的东西。我不知道 SQL Server 中有任何此类功能。有什么东西可以实现我的目标吗?

WITH
    SupercalifragilisticexpialidociousServer.db1.dbo
        SELECT * FROM Table1
END WITH

【问题讨论】:

  • 您可以查看同义词。每张桌子都需要一个,但没什么大不了的。
  • 您只需要table alias 吗?您需要为每个查询中的每个长表名称加上别名,但取决于您的查询,这可能足以让生活更轻松。 (同义词或视图可能会更好,但使用别名您不需要在服务器上创建任何额外的对象。)
  • @MattGibson 你可能是对的,我可能只使用表别名并保留它。我将进一步分解 FROM 和 JOIN 语句,以便代码清晰......

标签: sql-server tsql ms-access vba linked-server


【解决方案1】:

没有什么能准确映射到 VBA 的工作原理。您可以执行以下操作之一:

  1. 在查询中使用别名。

    select S.* from SupercalifragilisticexpialidociousServer.db1.dbo.Table1 as S;
    
  2. 使用Common Table Expression (CTE)

    with MyLongTableName as select S.* from SupercalifragilisticexpialidociousServer.db1.dbo.Table1
    select * from 
    MyLongTableName;
    
  3. 使用临时表:

    Select * into #MyTable from SupercalifragilisticexpialidociousServer.db1.dbo.Table1
    select * from #Mytable
    
  4. 使用synonym 为范围为当前数据库的表创建一个“别名”(您只需执行一次,因为它将保留在数据库中)。

    use [db1];
    create synonym dbo.RemoteTable1 for SupercalifragilisticexpialidociousServer.db1.dbo.Table1
    

    然后在你的存储过程中:

    select * from db1.dbo.RemoteTable1
    

谨慎使用 CTE,因为它们每次在语句中执行时都会被重新查询。此外,CTE 仅对当前语句有效,因此如果您有一系列查询都将使用它,则必须为每个查询重新声明它们。

如果事情随着时间的推移发生变化,同义词可能需要更多的维护,但它非常方便并且可供所有用户使用。但是,访问链接服务器的成本很高,因此不要过于频繁地这样做。

如果您要在存储过程中的多个查询中引用此数据,请将您的数据提取到一个临时表中(最好使用一组明确定义的标准,以便尽可能少地使用数据),以便在存储过程中使用程序可能是最合适的解决方案。

临时表上不会有任何索引,因此除非您显式创建它们,否则您也可能在那里遇到性能问题。但是您可以在同一会话中的多个查询中使用同一个临时表。

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2020-11-23
    • 2011-04-23
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多