1

変更可能なテーブル名に対応するために動的クエリにラップされた、基本的にこのようなクエリがあります。途中で日付関数を変換しましたが、最後に LoadedDateTime と CallPlacedTime が好きではありません。私は考えられるすべての変換と引用の組み合わせを試しました。どうすればこれを達成できますか?

DECLARE @sql_TotalDialsNewLeads nvarchar(1000) = N'
 SELECT COUNT(*)
   FROM ' + @tbl_CH + ' ch, ' + @tbl_CL + ' cl, ' + @tbl_DA + ' da
  WHERE ch.IDENTITY = cl.IDENTITY
    AND cl.CRMID = da.CRMID
    AND CallPlacedTime BETWEEN ''' +  CONVERT(varchar(30),DATEADD(HOUR,-@TimezoneOffset,@StartDate),126) + '''
                           AND ''' +  CONVERT(varchar(30),DATEADD(HOUR,-@TimezoneOffset,@EndDate),126) + '''
    AND Product = ''' + @Product + '''
    AND Country = ''' + @Country + '''
    AND DATEPART(DayOfYear,DATEADD(HOUR,-@TimezoneOffset,LoadedDateTime))
      = DATEPART(DayOfYear,DATEADD(HOUR,-@TimezoneOffset,CallPlacedTime))'

 EXECUTE(@sql_TotalDialsNewLeads);

ありがとう、ショーン

4

2 に答える 2

0

sp_executesql文字列を手動で実行するのではなく、パラメータで使用してみてください。

...    
AND CallPlacedTime BETWEEN DATEADD(HOUR,-@TimezoneOffset,@StartDate) 
AND DATEADD(HOUR,-@TimezoneOffset,@EndDate)
...

次のステートメントで実行します。

exec sp_executesql @sql_TotalDialsNewLeads, 
N'@StartDate datetime, @EndDate datetime',
@StartDate,@EndDate;

これがMSDNガイドです。また、SQLステートメントの他のパラメーターに対しても実行できます。

于 2012-08-20T08:32:07.543 に答える
0

外部で変換を使用する代わりに、動的クエリ内で使用します。

このようなもの。(未検証)

DECLARE @sql_TotalDialsNewLeads nvarchar(1000) = N'
 SELECT COUNT(*)
   FROM ' + @tbl_CH + ' ch, ' + @tbl_CL + ' cl, ' + @tbl_DA + ' da
  WHERE ch.IDENTITY = cl.IDENTITY
    AND cl.CRMID = da.CRMID
    AND CallPlacedTime BETWEEN CONVERT(varchar(30),DATEADD(HOUR,'''+ -@TimezoneOffset +''','''+ @StartDate +'''),126)
                           AND CONVERT(varchar(30),DATEADD(HOUR,'''+ -@TimezoneOffset +''','''+ @EndDate +'''),126)
    AND Product = ''' + @Product + '''
    AND Country = ''' + @Country + '''
    AND DATEPART(DayOfYear,DATEADD(HOUR,-@TimezoneOffset,LoadedDateTime))
      = DATEPART(DayOfYear,DATEADD(HOUR,-@TimezoneOffset,CallPlacedTime))'

 EXECUTE(@sql_TotalDialsNewLeads);
于 2012-08-20T09:04:18.540 に答える