【问题标题】:openquery passing date parameter conversion failedopenquery传递日期参数转换失败
【发布时间】:2017-04-12 13:46:15
【问题描述】:

创建了以下存储过程以在 SSRS 中创建数据集。但是当我在 SSRS 中运行查询时,从字符串转换日期时出现转换失败错误。我确定这是语法或变量问题。有什么想法吗?

   ALTER PROCEDURE [dbo].[usp_r_pcdh_counts]
     @START datetime,
     @END datetime
       AS
       BEGIN
       SET NOCOUNT ON;
   DECLARE @START1 datetime= @START 
   DECLARE @END1 datetime = @END
   DECLARE @sql nvarchar (4000)
   SET @sql= 'SELECT *
   FROM OPENQUERY(MR_UNI,''select 
                count(case when event_audit_type_key in ("1346","1038") then 1 else null end) as outsuccessful,
                count(case when event_audit_type_key = "1531" then 1 else null end) as outunsuccessful,
                count( case when event_audit_type_key in ("1040") then 1 else null end) as outdocsfound,
                count( case when event_audit_type_key in ("1532") then 1 else null end) as outdocsnotfound,
                count( case when event_audit_type_key in ("1042") then 1 else null end) as outdocsretrieved,
                count( case when event_audit_type_key in ("1580") then 1 else null end) as outdocsnotretrieved,
                count( case when event_audit_type_key in ("1048") then 1 else null end) as insuccess,
                count( case when event_audit_type_key in ("1048") and success_code = "12"  then 1 else null end) as infailure,
                count( case when event_audit_type_key in ("1050") then 1 else null end) as indocsretrieved
            from public.event_audit ea
            where ea.event_date >= convert(date,''''' + @START1+ ''''', 110)
                    and ea.event_date < convert(date, '''''+ @END1+ ''''', 110)
                    AND event_audit_key >= (SELECT MAX(event_audit_key) - 100 
                         FROM reports.event_audit_index 
                         WHERE event_date <= convert(date, '''''+ @START1+ ''''', 110))
                    AND event_audit_key <= (SELECT MIN(event_audit_key) + 100 
                         FROM reports.event_audit_index 
                          WHERE event_date >= convert(date, '''''+ @END1+''''', 110))'')'
    EXEC @sql
    END

【问题讨论】:

    标签: sql-server dataset ssrs-2012 data-conversion openquery


    【解决方案1】:

    您正在使用双重嵌套的动态 SQL (DSQL),这让您很头疼。诀窍是使用简单的打印语句弹出一层动态逻辑来检查该级别的语法,这将帮助您更好地解决此类问题。

    不管怎样,这应该给你正在寻找的:

    ALTER PROCEDURE [dbo].[usp_r_pcdh_counts]
        @START datetime,
        @END datetime
        AS
        BEGIN
        SET NOCOUNT ON;
    DECLARE @START1 datetime= @START 
    DECLARE @END1 datetime = @END
    DECLARE @sql nvarchar (4000)
    SET @sql= 'SELECT *
    FROM OPENQUERY(MR_UNI,''select 
                count(case when event_audit_type_key in (1346,1038) then 1 else null end) as outsuccessful,
                count(case when event_audit_type_key = 1531 then 1 else null end) as outunsuccessful,
                count( case when event_audit_type_key in (1040) then 1 else null end) as outdocsfound,
                count( case when event_audit_type_key in (1532) then 1 else null end) as outdocsnotfound,
                count( case when event_audit_type_key in (1042) then 1 else null end) as outdocsretrieved,
                count( case when event_audit_type_key in (1580) then 1 else null end) as outdocsnotretrieved,
                count( case when event_audit_type_key in (1048) then 1 else null end) as insuccess,
                count( case when event_audit_type_key in (1048) and success_code = 12  then 1 else null end) as infailure,
                count( case when event_audit_type_key in (1050) then 1 else null end) as indocsretrieved
            from public.event_audit ea
            where ea.event_date >= convert(date, ''''' + convert(varchar, @START1, 110)+ ''''', 110)
                    and ea.event_date < convert(date, '''''+ convert(varchar, @END1, 110) + ''''', 110)
                    AND event_audit_key >= (SELECT MAX(event_audit_key) - 100 
                            FROM reports.event_audit_index 
                            WHERE event_date <= convert(date, '''''+ convert(varchar, @START1, 110) + ''''', 110))
                    AND event_audit_key <= (SELECT MIN(event_audit_key) + 100 
                            FROM reports.event_audit_index 
                            WHERE event_date >= convert(date, '''''+ convert(varchar, @END1, 110) +''''', 110))'')'
    --PRINT @sql
    EXEC @sql
    END
    

    【讨论】:

    • 谢谢,我在 convert(varchar) 的外部添加了另一个引号来工作,但我现在收到错误“The name 'Select * from openquery .... is not a valid identifier”和继续显示 openquery 选择语句。我添加了 EXEC (@sql),这似乎有帮助,但现在我“+ 附近的语法不正确”
    • @Wendi - 我进行了编辑并删除了双引号,因为我希望这些关键字段被定义为 INTS 而不是 VARCHAR。那可能是你的问题。另外,我认为您不需要添加更多引号,因为嵌套应该适合我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多