我有一个存储过程和一个简单的表。
我需要加入这两个对象,然后允许用户在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
Microsoft查询只能做一个简单的
select * from tTable
我该怎么做?
我必须拥有存储过程,因为它在SP_Budget
编辑: 我想的越多。我想我需要发布原始的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;
EDIT2: 谢谢你提出的所有建议。我认为限制因素是微软查询本身。加上微软查询应该用更新的东西替换(我认为)。而不是配置我的服务器以允许openrowset或OPENQuery。我将研究微软查询替换。 不确定这是否是正确的方法。但我会在这里更新。谢谢。
编辑3:立即尝试此博客:http://blogs.office.com/2010/06/07/running-a-sql-stored-procedure-from-excel-no-vba/我将在完成后更新
答案 0 :(得分:0)
据我所知,您可以在JOIN
Microsoft Query
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')
答案 1 :(得分:0)
我使用下面的博客解决了这个问题 http://blogs.office.com/2010/06/07/running-a-sql-stored-procedure-from-excel-no-vba/
基本上在Excel中,当您单击数据选项卡 - 从其他来源 - 而不是“从微软查询”。我选择“从SQL服务器”。使用“来自SQL Server”。我在“连接属性 - 定义”中有选项可以选择命令类型为SQL(而不是表格)
博客用屏幕截图解释了这一点......谢谢