从Excel调用多表SQL查询而不使用sproc

时间:2011-03-30 23:13:42

标签: tsql excel

我有一个连接多个表的复杂SQL查询。这是一个淡化版本......

DECLARE @AreaPath varchar(128)
DECLARE @IterationPath varchar(256)

SELECT 
  [Scenario Id],
  scenarios.[Feature Id],
  [Task Id],
  [AreaPath],
  [IterationPath]
FROM
    (SELECT 
      [SourceWorkItemID] as [Scenario Id],
      [TargetWorkItemID] as [Feature Id],
      [LinkName]
    FROM [TFS_Warehouse].[dbo].[FactWorkItemLinkHistory] as hist
    JOIN TFS_Warehouse.dbo.DimWorkItemLinkType as links
      ON hist.WorkItemLinkTypeSK = links.WorkItemLinkTypeSK
    Where [LinkName] = 'Feature Link') as scenarios
LEFT OUTER JOIN
    (SELECT 
      [SourceWorkItemID] as [Feature Id],
      [TargetWorkItemID] as [Task Id],
      [LinkName]
    FROM [TFS_Warehouse].[dbo].[FactWorkItemLinkHistory] as hist
    JOIN TFS_Warehouse.dbo.DimWorkItemLinkType as links
      ON hist.WorkItemLinkTypeSK = links.WorkItemLinkTypeSK
    Where [LinkName] = 'Child') as tasks
  ON scenarios.[Feature Id] = tasks.[Feature Id]
LEFT OUTER JOIN TFS_Warehouse.dbo.CurrentWorkItemView as workItem
  ON tasks.[Task Id] = workItem.System_Id
WHERE [IterationPath] = @IterationPath
  AND [AreaPath] = @AreaPath
ORDER BY [Scenario Id], scenarios.[Feature Id], tasks.[Task Id]

我想从excel电子表格中调用此查询,但我没有权限将sproc添加到我查询的数据库中。我还希望能够从电子表格中为AreaPath和IterationPath设置值。

是否可以从Excel调用此查询?如果没有,那么执行此查询并将查询输出导入Excel的好方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您的查询确实是单个查询(而不是几个SQL语句),那么您可以玩一招:

创建一个普通的Excel查询表,该表指向正确的数据源并包含所需数量的参数,但选择不相关的内容(例如select 1,2,3,4,5 from existing_table where existing_field = [param1] and existing_field = [param2])。
您现在有一个带有两个参数的模板查询。将这些与纸张上的细胞相关联。

现在,在模板查询结果中选择一个单元格并执行以下命令:

activecell.querytable.commandtext = "sql text"

sql text中,将参数替换为?。没有declare个或变量,只有select。参数将按位置引用,而不是按名称引用。这意味着,如果在查询中多次使用相同的参数,则它们是不同的参数,必须单独添加到模板中。

您知道有一个可以接受参数的工作查询表,同时执行“无法以图形方式表示”的复杂查询。

关键是,Excel可以运行带参数的复杂查询,它是无法处理它的Microsoft Query。

请注意,尝试使用Microsoft Query编辑此查询表会破坏它。您可能希望将SQL保存在其他地方,以防您不情愿地这样做。

答案 1 :(得分:0)

是的,您可以从Excel调用查询。有许多不同的方法,我会查找ADO和Excel来获取语法。可以很容易地将单元格放在值,读取它们,并将它们作为参数添加,直接或使用动态SQL。

Here's an article让你开始。