【问题标题】:How can I select this in Microsoft Query?如何在 Microsoft Query 中选择此项?
【发布时间】:2015-05-22 00:24:38
【问题描述】:

我有一个存储过程和一个简单的表。

我需要加入这两个对象,然后允许用户在 Excel 中使用Microsoft Query 查看结果。

这就是我所拥有的。 Exec SP_Budget创建全局临时表并填写##tmpBudget

exec SP_Budget;
Select g.name, g.address,g.Amount,b.BudgetAmt from gTable g
Left join ##tmpBudget b on b.NameID=g.NameID

微软查询只能做一个简单的

select * from tTable 

我该怎么做?

我必须拥有存储过程,因为它在 SP_Budget 内进行 UNpivot

编辑: 我越是想这个。我想我需要发布原始 SP_Budget 所以就在这里。因为也许更好的方法是创建一个函数而不是 SP_Budget。这是我的 SP_Budget。能不能把这个SP转成函数?

--this link show me how to build column list for the PIVOT/UNPIVOT http://stackoverflow.com/questions/9585094/sql-server-pivots-displaying-row-values-to-column-headers
--this link show me how to build column list of a specific table http://stackoverflow.com/questions/18775409/unpivot-with-dynamic-columns-plus-column-names
--here we build the dynamic query for the column list for the PIVOT/UNPIVOT 
declare @sql  AS NVARCHAR(MAX);
declare @cols nvarchar(max);
select @cols = coalesce(@cols+N',', N'') + quotename(c.name) from syscolumns c
inner join sysobjects o on c.id = o.id and o.xtype = 'u'
where o.name = 'AcctHist' and c.name not in ('PID', 'UID') and c.name like 'ptdbal%' and  c.name <> 'PtdBal12' order by c.colid

--Construct the full T-SQL statement
--and execute dynamically
SET @sql = N'select 
DB,Acct,Sub,cpnyid
,Fiscyr+
CASE WHEN len(Convert(varchar(2),CONVERT(int,right(Period,2))+1))=1
THEN ''0''+Convert(varchar(2),CONVERT(int,right(Period,2))+1) 
ELSE Convert(varchar(2),CONVERT(int,right(Period,2))+1)
END "Period"
,Amounts
from (
SELECT  A.DB,A.Sub,A.acct,A.FiscYr,A.CpnyID
, sum(A.PtdBal00) "PtdBal00" 
,sum(A.PtdBal01) "PtdBal01"
,sum(A.PtdBal02) "PtdBal02"
,sum(A.PtdBal03) "PtdBal03"
,sum(A.PtdBal04) "PtdBal04"
,sum(A.PtdBal05) "PtdBal05"
,sum(A.PtdBal06) "PtdBal06"
,sum(A.PtdBal07) "PtdBal07"
,sum(A.PtdBal08) "PtdBal08"
,sum(A.PtdBal09) "PtdBal09"
,sum(A.PtdBal10) "PtdBal10"
,sum(A.PtdBal11) "PtdBal11"
FROM vz_Finance_Budget A
Group by   A.DB,A.Sub,A.acct,A.FiscYr,A.CpnyID
)xx
UNPIVOT (Amounts for Period in ('+@cols+')) unpiv;';
EXEC sp_executesql @sql;

编辑2: 感谢您的所有建议。我决定限制因素是微软查询本身。加上微软查询应该用更新的东西代替(我认为)。而不是将我的服务器配置为允许 openrowset 或 OPENQuery。我将研究微软查询替换。 不确定这是否是正确的方法。但我会在这里更新。谢谢。

Edit3:现在试试这个博客:http://blogs.office.com/2010/06/07/running-a-sql-stored-procedure-from-excel-no-vba/ 完成后我会更新

【问题讨论】:

    标签: sql-server tsql microsoft-query


    【解决方案1】:

    据我所知,您可以在 Microsoft Query 中使用明确的 JOIN

    Description of the usage of joins in Microsoft Query

    SELECT ....
    FROM tbl1, tbl2
    WHERE tbl1.Id = tbl2.Id
    

    更新

    如果您想在 Excel 中设置结果,您可以使用OPENROWSET 将数据从 SQL Server 导出到 Excel。

    INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\testing.xls;', 
    'SELECT name, address, Amount, BudgetAmt FROM [Sheet1$]') 
    SELECT g.name, g.address, g.Amount, b.BudgetAmt FROM gTable g
    LEFT JOIN #tmpBudget b ON b.NameID = g.NameID
    

    正如你刚才提到的,你需要先将你的 proc 结果保存到一个临时表中

    sp_configure 'Show Advanced Options', 1
    GO
    RECONFIGURE
    GO
    sp_configure 'Ad Hoc Distributed Queries', 1
    GO
    RECONFIGURE
    GO
    
    SELECT * INTO #tmpBudget
    FROM OPENROWSET('SQLNCLI'
                    ,'Server=(local)\SQL2008;Trusted_Connection=yes;'
                    ,'EXEC SP_Budget') 
    

    【讨论】:

    • 正确。我只需要一种方法来模拟我的复杂逻辑并将其呈现为一个简单的表格,然后 Microsoft Query 可以将其拾取。问题是我的复杂逻辑需要一个存储过程,我只是不知道如何摆脱没有存储过程。它必须是存储过程的原因是,这是我知道如何获取动态 UNPIVOT SQL 的唯一方法。如果我没记错的话 Function 不能允许 exec 语句。在我的 Dynamic UNPIVOT SQL 中,我有 exec sp_executeSQL .. 如果我能找到另一种方法,那么我可以使用一个函数。
    【解决方案2】:

    我使用下面的这个博客解决了这个问题 http://blogs.office.com/2010/06/07/running-a-sql-stored-procedure-from-excel-no-vba/

    基本上在 excel 中,当您单击数据选项卡时 - 来自其他来源 - 而不是“来自 microsoft 查询”。我选择“从 SQL 服务器”。使用“来自 SQL Server”。我在“连接属性 - 定义”中有选项来选择 SQL 的命令类型(而不是表)

    博客用截图解释了这一点......谢谢

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多