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_executesqlwith 参数而不是使字符串手动执行:

...    
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 回答