2

このコードをつなぎ合わせて、ディーラーごとの請求書の小計の合計にピボットを作成しました。それは機能し、正しい結果を生成します。ただし、それをストアド プロシージャに変換しようとすると、悪名高い赤い波線が SQL Server 管理スタジオの "CREATE VIEW Revenues" の下に表示され、次のエラーが表示されます。

「CREATE VIEW はバッチ内の唯一のステートメントである必要があります」。ASP.NET/C# Web アプリから実行できるようにする必要があるため、続行するのに十分な T-SQL がわかりません。

次のようにしてSPを作成しようとしています:

1)

USE [Sherwood]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROC [dbo].[usp_GetRevenues] 

@StartDate AS DateTime = '20120301',
@EndDate AS DateTime = '20120401'
AS
SET NOCOUNT ON;

BEGIN

前に、最後に END ステートメントを付けます。

2)数か月間データをフィルタリングできるようにするにはパラメーターが必要ですが、パラメーターを渡したり、コードで変数をそのまま使用したりできないようです。

前もって感謝します。

以下のコード - 変数でフィルタリングする必要がある場所を示します。このコードは、where 句で '1/1/2012' 形式の日付でのみ機能しますが、示されているように変数を渡すことができる必要があります。

--================================

CREATE VIEW Revenues
AS
SELECT  
i.DateOrdered
,LTRIM(STR(DATEPART(MONTH,i.DateOrdered))) AS [Month]  
,LTRIM(STR(YEAR(i.Dateordered))) AS [Year]  
,c.CustomerCode
,SUM(i.Jobprice) AS Subtotal 
FROM Invoices i
JOIN
Customers c
ON i.CustomerID = c.ID
WHERE i.DateOrdered >= @StartDate 
AND i.DateOrdered <= @EndDate **<-- and here.**  
GROUP BY ROLLUP (YEAR(i.DateOrdered), 
MONTH(i.DateOrdered), i.DateOrdered, c.CustomerCode);
GO

IF OBJECT_ID('Revenues2') IS NOT NULL
DROP VIEW Revenues2
GO

CREATE VIEW Revenues2
AS
SELECT 
 LTRIM(STR([YEAR])) + '-' + STUFF([Month],1,0, REPLICATE('0', 2 - LEN([Month]))) 
 AS [Date] 
,Subtotal
,CustomerCode
FROM Revenues
WHERE CustomerCode IS NOT NULL
GO

DECLARE @query VARCHAR(4000)  
DECLARE @years VARCHAR(2000)  
SELECT  @years = STUFF(( SELECT DISTINCT 
                    '],[' + [Date]  
                    FROM  Revenues2 
                    ORDER BY '],[' + [Date]  
                    FOR XML PATH('')  
                    ), 1, 2, '') + ']' 

SET @query =  
'SELECT * FROM  
(  
  SELECT Subtotal,[Date],CustomerCode  
   FROM Revenues2  
)t  
PIVOT (SUM(Subtotal) FOR [Date] 
IN ('+ @years +')) AS pvt' 

EXECUTE (@query) 

--==========================================

よろしく

4

2 に答える 2

1

間違っているかもしれませんが、SPに変換するときに、「CREATEVIEW」の部分を削除/コメントしていないようです。これは、ストアドプロシージャの定義内からビューを定義できないため、間違っています。したがって、「CREATE VIEW must be(...)」という苦情があります。

さらに、そのコードは少し壊れやすいものです。SPを正しく作成すると、次に実行すると、「SPはすでに使用されています。ALTERPROCを使用する必要があります」などのメッセージが表示されてエラーが発生します(私は記憶から書いています知っています)。

このようなコードは、両方の問題を解決するはずです。

USE [Sherwood]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- It's preferable to set these options before creating an SP,
-- rather than within its execution
SET NOCOUNT ON
GO
IF OBJECT_ID('usp_GetRevenues') IS NOT NULL
    DROP PROC usp_GetRevenues
GO
CREATE PROC [dbo].[usp_GetRevenues] 
    @StartDate AS DateTime = '20120301',
    @EndDate AS DateTime = '20120401' AS
-- BEGIN --This is really optional
SELECT  
i.DateOrdered
,LTRIM(STR(DATEPART(MONTH,i.DateOrdered))) AS [Month]  
,LTRIM(STR(YEAR(i.Dateordered))) AS [Year]  
,c.CustomerCode
,SUM(i.Jobprice) AS Subtotal 
FROM dbo.Invoices i
JOIN dbo.Customers c
ON i.CustomerID = c.ID
WHERE i.DateOrdered >= @StartDate 
AND i.DateOrdered <= @EndDate **<-- and here.**  
GROUP BY ROLLUP (YEAR(i.DateOrdered), 
MONTH(i.DateOrdered), i.DateOrdered, c.CustomerCode);
GO
于 2012-09-11T04:56:57.250 に答える
1

代わりに一時テーブルを使用してこれを試すことができます。

何かのようなもの

SELECT   
i.DateOrdered 
,LTRIM(STR(DATEPART(MONTH,i.DateOrdered))) AS [Month]   
,LTRIM(STR(YEAR(i.Dateordered))) AS [Year]   
,c.CustomerCode 
,SUM(i.Jobprice) AS Subtotal  
INTO #Revenues
FROM Invoices i 
JOIN 
Customers c 
ON i.CustomerID = c.ID 
WHERE i.DateOrdered >= @StartDate  
AND i.DateOrdered <= @EndDate **<-- and here.**   
GROUP BY ROLLUP (YEAR(i.DateOrdered),  
MONTH(i.DateOrdered), i.DateOrdered, c.CustomerCode)

SELECT  
 LTRIM(STR([YEAR])) + '-' + STUFF([Month],1,0, REPLICATE('0', 2 - LEN([Month])))  
 AS [Date]  
,Subtotal 
,CustomerCode 
INTO #Revenues2
FROM #Revenues 
WHERE CustomerCode IS NOT NULL 

DECLARE @query VARCHAR(4000)   
DECLARE @years VARCHAR(2000)   
SELECT  @years = STUFF(( SELECT DISTINCT  
                    '],[' + [Date]   
                    FROM  #Revenues2  
                    ORDER BY '],[' + [Date]   
                    FOR XML PATH('')   
                    ), 1, 2, '') + ']'  

SET @query =   
'SELECT * FROM   
(   
  SELECT Subtotal,[Date],CustomerCode   
   FROM #Revenues2   
)t   
PIVOT (SUM(Subtotal) FOR [Date]  
IN ('+ @years +')) AS pvt'  

EXECUTE (@query)

DROP TABLE #Revenues
DROP TABLE #Revenues2
于 2012-09-11T04:28:09.373 に答える