1

ストアド プロシージャと単純なテーブルがあります。

この 2 つのオブジェクトを結合し、ユーザーMicrosoft Queryが Excel を使用して結果を確認できるようにする必要があります。

これは私が持っているものです。グローバル一時テーブルの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 

これどうやってするの?

内部でUNpivotを行うため、ストアドプロシージャが必要です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:すべての提案をありがとう。制限要因は Microsoft クエリ自体であると判断しました。さらに、Microsoft クエリは新しいものに置き換える必要があります (私はそう思います)。openrowset または OPENQuery を許可するようにサーバーを構成する代わりに。マイクロソフトのクエリ置換について調べます。これが正しい方法かどうかはわかりません。しかし、ここで更新します。ありがとう。

Edit3: このブログを今試しています: http://blogs.office.com/2010/06/07/running-a-sql-stored-procedure-from-excel-no-vba/ 完了したら更新します

4

2 に答える 2

0

以下のこのブログを使用してこれを解決しました http://blogs.office.com/2010/06/07/running-a-sql-stored-procedure-from-excel-no-vba/

基本的にExcelでは、「Microsoftクエリから」ではなく、データタブ(他のソースから)をクリックすると。「SQL サーバーから」を選択します。「SQL Serverから」で。「接続プロパティ - 定義」に、(テーブルではなく) コマンド タイプを SQL に選択するオプションがあります。

ブログはこれをスクリーンショットで説明しています...ありがとう

于 2015-05-21T16:24:38.770 に答える
0

私が知る限り、あなたは明示的JOINに持つことができますMicrosoft Query

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

先ほど述べたように、最初にプロシージャの結果を一時テーブルに保存する必要があります

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') 
于 2015-05-21T02:21:06.173 に答える