2016-04-14 58 views
0
ALTER PROCEDURE [dbo].[TEST_01]  
    (
     @StartDate DateTime, 
     @EndDate DateTime 
    ) 
    AS  
    BEGIN  
     SET NOCOUNT ON; 
     Declare @sql as nvarchar(MAX); 
     SET @sql = @sql + ';WITH CTE_ItemDetails 
       MAX(D.Name) as Name, 
       SUM(ISNULL(DT.col1, 0)) AS col1, 
       SUM(ISNULL(DT.col2, 0)) AS col2, 
       SUM(ISNULL(DT.col3, 0)) AS col3, 
       GROUPING(D.ItemType) AS ItemTypeGrouping 
      FROM Items D 
       INNER JOIN Details DT ON DT.ItemId = D.ItemId 
       INNER JOIN Report R ON R.ReportId = DT.ReportId 
       where 1=1' 
      SET @sql = @sql + ' AND (R.ReportDate >= ' + @StartDate + 'AND R.ReportDate <=' + @EndDate +')' 

      IF @someOtherVariable is not null 
      SET @sql = @sql + ' AND R.someColumn IN (''' +replace(@someOtherVariableValues,',','')+''+')' 

      SET @sql = @sql + 'SELECT col1, col2, col3 FROM CTE_ItemDetails' 
      EXECUTE (@sql) 
    END 

我有一個類似於上面的T-SQL代碼的存儲過程。 (請注意,我刪除了很多代碼,我覺得這與我所得到的錯誤無關) 當我執行它時,出現以下錯誤。錯誤消息轉換日期時間從字符串轉換失敗

從字符串轉換datetime時轉換失敗。

我的參數值有以下格式

exec TEST_01 @StartDate=N'4/1/2016 12:00:00 AM',@EndDate=N'4/30/2016 12:00:00 AM' 

看起來麻煩是方法,我在動態線路設置以下

SET @sql = @sql + ' AND (R.ReportDate >= ' + @StartDate + 'AND R.ReportDate <=' + @EndDate +')' 

的SQL語句是什麼最好的日期格式我可以申請避免錯誤。

+0

您需要引用日期,您應該將其更改爲'@sql +'AND(R.ReportDate> ='''+ @StartDate +'''AND R.ReportDate <='''+ @EndDate +' '')' – Siyual

+0

@Siyual這將返回相同的錯誤 – StackTrace

回答

1

您應該通過sp_executesql使用參數。

但你眼前的問題是這一行:

SET @sql = @sql + ' AND (R.ReportDate >= ' + @StartDate + 'AND R.ReportDate <=' + @EndDate +')' 

它看起來更像是:

SET @sql = @sql + ' AND (R.ReportDate >= ''' + convert(varchar(10), @StartDate, 121) + ''' AND R.ReportDate <= ''' + convert(varchar(10), @EndDate, 121) +''')' ; 

注意列入明確的類型轉換爲字符串和雙單引號這樣的日期文字不被解釋爲2016 - 04 - 14(即2000)。

使用參數的較好的方法是這樣的:

SET @sql = @sql + ' AND (R.ReportDate >= @StartDate AND R.ReportDate <= @EndDate)' ; 

. . . 
exec sp_executesql @sql, N'@StartDate date, @EndDate date)', @StartDate = @StartDate, @EndDate = @EndDate; 

更容易閱讀的SQL語句。類型問題通過參數處理。而且,查詢計劃更容易隱藏起來。不幸的是,參數只適用於常量,而不適用於列或表名。

+0

如果我使用'sp_executesql'並傳遞一個未添加到@sql字符串的參數,因爲它被發現爲空或空?會發生什麼?我問這是因爲我添加了一些參數(最初發布的腳本中未顯示)。我已更新我的代碼以顯示此內容。 – StackTrace

+0

@StackTrace。 。 。如果參數在第二個和第三個參數中聲明,那麼它是否在SQL字符串中並不重要。 –

相關問題