2012-09-11 39 views
2

我已将这些代码拼凑在一起,以便为每个经销商的发票小计总和创建一个数据透视表。它工作,并产生正确的结果。但是,当我尝试将其转换为存储过程时,SQL Server管理工作室中的“CREATE VIEW Revenues”下出现臭名昭着的红线,并且错误表示为:将包含视图的代码转换为存储过程

'CREATE VIEW必须是批处理中唯一的语句'而且我不知道足够多的T-SQL需要继续执行,因为我需要从ASP.NET/C#Web应用程序执行它。

我试图通过把创建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) 

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

问候

+0

的SQL Server版本您使用的? –

回答

1

我可能是错的,但在我看来,你不删除/发表评论的“CREATE VIEW”的一部分,当你转换为SP。这是错误的,因为你无法从存储过程的定义中定义视图 - 因此“CREATE VIEW必须是(...)”投诉。

此外,您的代码有点脆弱:一旦您正确地创建了SP,下次运行它时,将出现错误信息“SP已经使用,您应该使用ALTER PROC”或类似的东西(我从记忆中知道)。

这样的代码应该解决这两个问题:

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 
+0

我创建了视图,因为我必须从前面的SELECT语句对数据集执行操作。我是否创建和删除临时表或者处理这种情况的最佳方式是什么?您能否告诉我一些如何编码 - 正如我不知道的 - 因此是意见。谢谢你的帮助。 –

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 
+0

临时表。好主意,它几乎编译。我在SET @query第56行的SELECT语句中出现语法错误。实际的错误是Msg 102,Level 15,State 1,Procedure usp_GetRevenues,Line 56'END'附近的语法错误。 –

+0

请显示您的完整代码。 –

+0

删除BEGIN和END使所有的区别和临时表肯定是要走的路 - 它编译和运行。感谢您的帮助 - Cliff –