从字符串转换日期/时间时转换失败

conversion failed when converting date /time from character string

SELECT [PROC_ID]
    ,[CONTACT_DATE_new]
    ,[CPT_CODE_new]
    ,[CHARGEABLE_YN_new]
    ,cat.CDM_Category
    ,DateUpdated
FROM
    [dbo].CDM_Audit_EAP_OT]
WHERE 
    @ColDate BETWEEN @Start_Date AND @End_Date

添加新参数后@ColDate,我开始出现上述错误。

@ColDate 有 "CONTACT_DATE_new" 或 "DateUpdated"。用户将根据自己的需求选择其中之一。

如果我直接指定列,报告将正常工作。

 WHERE CONTACT_DATE_new BETWEEN @Start_Date AND @End_Date
 WHERE DateUpdated BETWEEN @Start_Date AND @End_Date

请在 where 子句中使用以下语句。我没有测试以下脚本。

SELECT [PROC_ID]
        ,[CONTACT_DATE_new]
        ,[CPT_CODE_new]
        ,[CHARGEABLE_YN_new]
        ,cat.CDM_Category
        ,DateUpdated
    FROM
        [dbo].[CDM_Audit_EAP_OT]
where
   (@locationType = 'DateUpdated' AND (DateUpdated BETWEEN @Start_Date AND @End_Date)

案例

SELECT [PROC_ID]
        ,[CONTACT_DATE_new]
        ,[CPT_CODE_new]
        ,[CHARGEABLE_YN_new]
        ,cat.CDM_Category
        ,DateUpdated
    FROM
        [dbo].[CDM_Audit_EAP_OT]
    where    
    CASE 
    when @locationType =  'DateUpdated' and (DateUpdated BETWEEN @Start_Date AND @End_Date) then 1
    Else 0
    End = 1 

您查询中的@ColDate不被视为列名,而是被视为字符串类型变量。当您尝试将其值与 @startdate@enddate 进行比较时,它会失败。因此错误。您可以按如下方式创建存储过程以满足您的需要:-

Create PROCEDURE [SSRSReport]

@Start_Date date,
@End_Date date,
@ColDate nvarchar(25)

AS

BEGIN
SET NOCOUNT ON

declare @sql1 nvarchar(max)

if @ColDate = 'CONTACT_DATE_new'

begin
set @sql1 = 
'SELECT [PROC_ID]
    ,[CONTACT_DATE_new]
    ,[CPT_CODE_new]
    ,[CHARGEABLE_YN_new]
    ,cat.CDM_Category
    ,DateUpdated
FROM
    [dbo].CDM_Audit_EAP_OT]
WHERE 
    CONTACT_DATE_new BETWEEN ''' + cast(Convert(nvarchar(10),@Start_Date ,120) as Nvarchar(max)) +''' 
    AND ''' + cast(Convert(nvarchar(10),@End_Date ,120) as Nvarchar(max)) + ''''
    end

    else if @ColDate = 'DateUpdated'

    begin
set @sql1 = 
'SELECT [PROC_ID]
    ,[CONTACT_DATE_new]
    ,[CPT_CODE_new]
    ,[CHARGEABLE_YN_new]
    ,cat.CDM_Category
    ,DateUpdated
FROM
    [dbo].CDM_Audit_EAP_OT]
WHERE 
    DateUpdated BETWEEN ''' + cast(Convert(nvarchar(10),@Start_Date ,120) as Nvarchar(max)) +''' 
    AND ''' + cast(Convert(nvarchar(10),@End_Date ,120) as Nvarchar(max)) + ''''
    end

    print @sql1
    exec sp_executesql @sql1

end