2013-03-06 152 views
-1

以下是過程。我一直在獲取SQL必須聲明標量變量「@sql」,即使我已將@startdate轉換爲varchar。我錯過了什麼?SQL必須聲明標量變量

CREATE PROCEDURE [dbo].[project_revenue_forecast_monthly] 
@startDate datetime, 
@sql varchar(max) 
AS 

SET @sql = 'SELECT CLIENTNAME, PROJECTNAME, PROJECTSD, 
    isnull([' + REPLACE(SUBSTRING(CONVERT(varchar, @startDate, 13), 4, 8), ' ', '') + '],0) as 
     [' + REPLACE(SUBSTRING(CONVERT(varchar, @startDate, 13), 4, 8), ' ', '') + '], 
    isnull([' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 1, @startDate), 13), 4, 8), ' ', '') + '],0) as 
     [' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 1, @startDate), 13), 4, 8), ' ', '') + '], 
    isnull([' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 2, @startDate), 13), 4, 8), ' ', '') + '],0) as 
     [' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 2, @startDate), 13), 4, 8), ' ', '') + '], 
    isnull([' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 3, @startDate), 13), 4, 8), ' ', '') + '],0) as 
     [' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 3, @startDate), 13), 4, 8), ' ', '') + '], 
    isnull([' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 4, @startDate), 13), 4, 8), ' ', '') + '],0) as 
     [' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 4, @startDate), 13), 4, 8), ' ', '') + '], 
    isnull([' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 5, @startDate), 13), 4, 8), ' ', '') + '],0) as 
     [' + REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 5, @startDate), 13), 4, 8), ' ', '') + '], 
    FORECASTTIMEDAYS, BILLINGRATEDAILY 
    FROM 
     (
     SELECT 
     CLIENTNAME, PROJECTNAME, PROJECTS, SCHENTRYDATE, FORECASTTOTAL 
     FROM viewprojscheduling_group 
    ) AS SourceTable 
    PIVOT 
     (
     SUM(FORECASTTOTAL) 
     FOR SCHENTRYDATE IN (' + 
       QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, @startDate, 13), 4, 8), ' ', '')) + ', ' + 
       QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 1, @startDate), 13), 4, 8), ' ', '')) + ', ' + 
       QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 2, @startDate), 13), 4, 8), ' ', '')) + ', ' + 
       QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 3, @startDate), 13), 4, 8), ' ', '')) + ', ' + 
       QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 4, @startDate), 13), 4, 8), ' ', '')) + ', ' + 
       QUOTENAME(REPLACE(SUBSTRING(CONVERT(varchar, DATEADD(MONTH, 5, @startDate), 13), 4, 8), ' ', '')) + ') 
    ) AS PivotTable' 

execute(@sql) 
+0

推薦閱讀:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx和http:/ /sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/bad-habits-to-kick-using-exec-instead-of-sp-executesql.aspx – 2013-03-08 12:42:46

回答

2

做這種方式,請注意,如果你不希望傳遞出從你@Startdate應該改變它的地方太多。

CREATE PROCEDURE [dbo].[project_revenue_forecast_monthly] 
@startDate datetime, 

AS 

Declare @sql varchar(max) 
..... 
+0

感謝此工作 – 0onetwo 2013-03-06 22:05:42