2016-04-14 14 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を変換するときに変換に失敗しました

文字列から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 >= ''' + convert(varchar(10), @StartDate, 121) + ''' AND R.ReportDate <= ''' + convert(varchar(10), @EndDate, 121) +''')' ; 

注文字列に明示的な型キャストを含めると日付ので、二重の単一引用符:それはより多くのようになるはず

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

リテラルは2016 - 04 - 14(つまり2000)と解釈されません。 SQL文を読みやすい

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

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

:よう

パラメータを使用してのより良い方法が見えます。型の問題はパラメータによって処理されます。そして、クエリプランはより簡単に隠されます。残念ながら、パラメータは定数に対してのみ機能し、カラムやテーブル名では機能しません。

+0

もし私が 'sp_executesql'を使用し、@ sql文字列に追加されていないパラメータを渡すとどうなるでしょうか?私はいくつかのパラメータを追加しているので、これを尋ねています(最初に投稿したスクリプトには表示されていません)。私はこれを示すコードを更新しました。 – StackTrace

+0

@StackTrace。 。 。パラメータが2番目と3番目の引数で宣言されている場合、SQL文字列内にあるかどうかは関係ありません。 –

関連する問題