2014-09-25 63 views
0

我试图运行该SP在SSRS,但它给我下面的错误 -动态SQL SSRS给人以错误的参数转换为datetime

未能参数值从字符串转换为日期时间。

我不明白我在这里做错了什么。它是一个动态SQL。我知道错误发生在转换日期参数的日期转换中。这四个参数是 - @ dtAdjustedStart,@ dtAdjustedEnd,@ dtAdjustedStartLY,@ dtAdjustedEndLY。任何人都可以请帮助我 -

ALTER PROC SSRS_Specials_Performance_Report(@DB varchar(30),@cOperators varchar(50),@dtAdjustedStart DATETIME,@dtAdjustedEnd DATETIME, @dtAdjustedStartLY DATETIME,@dtAdjustedEndLY DATETIME,@cSalespoints 
varchar(30),@vcRankingColumn varchar(30), @vcRankingDirection varchar(30)) 

    AS 

DECLARE @SQL VARCHAR(MAX) 




IF OBJECT_ID('tempdb..#transact_ty') IS NOT NULL DROP TABLE #transact_ty; 
CREATE TABLE #transact_ty 
(
special CHAR(10), 
quantity INT, 
admissions INT, 
pr_ctr_1 INT, 
pcsplit_1 MONEY, 
pr_ctr_2 INT, 
pcsplit_2 MONEY, 
pr_ctr_3 INT, 
pcsplit_3 MONEY, 
pr_ctr_4 INT, 
pcsplit_4 MONEY, 
pr_ctr_5 INT, 
pcsplit_5 MONEY, 
pr_ctr_6 INT, 
pcsplit_6 MONEY 
); 


IF OBJECT_ID('tempdb..#transact_ly') IS NOT NULL DROP TABLE #transact_ly; 
CREATE TABLE #transact_ly 
(
special CHAR(10), 
quantity INT, 
admissions INT, 
pr_ctr_1 INT, 
pcsplit_1 MONEY, 
pr_ctr_2 INT, 
pcsplit_2 MONEY, 
pr_ctr_3 INT, 
pcsplit_3 MONEY, 
pr_ctr_4 INT, 
pcsplit_4 MONEY, 
pr_ctr_5 INT, 
pcsplit_5 MONEY, 
pr_ctr_6 INT, 
pcsplit_6 MONEY 
) 

IF OBJECT_ID('tempdb..#ReportOutput') IS NOT NULL DROP TABLE #ReportOutput; 
CREATE TABLE #ReportOutput 
(
Special   CHAR(10), 
SpecialDescription VARCHAR(25), 
SpecialAdmitsTY INT, 
SpecialRevenueTY MONEY, 
SpecialPctOfTotal NUMERIC(12,4), 
SpecialRevenueLY MONEY, 
ProfitCenter  VARCHAR(25), 
RevenueCenter  VARCHAR(25), 
AdmissionsTY  INT, 
RevenueTY   MONEY, 
TotalRevenueTY  MONEY, 
AdmissionsLY  INT, 
RevenueLY   MONEY, 
TotalRevenueLY  MONEY, 
AdmissionsVariance INT, 
RevenueVariance MONEY 
); 

SET @SQL = 'INSERT INTO #transact_ty 
SELECT t.special, 
    t.quantity, 
    t.admissions, 
    t.pr_ctr_1, 
    t.pcsplit_1, 
    t.pr_ctr_2, 
    t.pcsplit_2, 
    t.pr_ctr_3, 
    t.pcsplit_3, 
    t.pr_ctr_4, 
    t.pcsplit_4, 
    t.pr_ctr_5, 
    t.pcsplit_5, 
    t.pr_ctr_6, 
    t.pcsplit_6 
    FROM ' + @DB + '.dbo.transact t 
    WHERE t.date_time BETWEEN CAST(''' + CONVERT(varchar,@dtAdjustedStart,120) + ''' AS DATE) AND CAST('''+ CONVERT(varchar,@dtAdjustedEnd,120) + ''' AS DATE) 
    AND t.operator IN ('''+ @cOperators + ''') 
    AND t.salespoint IN (''' + @cSalespoints + ''')' 

    EXEC(@SQL) 

    SET @SQL = 'INSERT INTO #transact_ly 
    SELECT t.special, 
    t.quantity, 
    t.admissions, 
    t.pr_ctr_1, 
    t.pcsplit_1, 
    t.pr_ctr_2, 
    t.pcsplit_2, 
    t.pr_ctr_3, 
    t.pcsplit_3, 
    t.pr_ctr_4, 
    t.pcsplit_4, 
    t.pr_ctr_5, 
    t.pcsplit_5, 
    t.pr_ctr_6, 
    t.pcsplit_6 
    FROM ' + @DB + '.dbo.transact t 
    WHERE t.date_time BETWEEN CAST('''+ CONVERT(varchar,@dtAdjustedStartLY,120) + ''' AS DATE) AND CAST(''' + CONVERT(varchar,@dtAdjustedEndLY,120)+ ''' AS DATE) 
    AND t.operator IN (''' + @cOperators + ''') 
    AND t.salespoint IN (''' + @cSalespoints + ''')' 


    EXEC(@SQL) 
+2

如果你PRINT @SQL执行之前,这是否给你任何线索?你可以发布给出错误的PRINT的结果吗? – 2014-09-25 14:54:20

+0

其实根据你的错误信息,我怀疑你在调用proc的代码中出错,而不是在proc本身。你想传递给proc的值是什么? – 2014-09-25 14:59:24

回答

0

您打电话CONVERT错误的类型。通过DATETIME作为参数传递给CONVERT,而不是VARCHAR

CONVERT(DATETIME,@dtAdjustedStartLY,120) 
+2

她需要将日期转换为varchar,以便她可以构建动态SQL字符串。 – 2014-09-25 14:53:09

+0

@TabAlleman然后使用最后的日期时间样式参数进行转换没有意义。仅在将字符串转换为日期时才有用 – Oscar 2014-09-25 14:55:03

+0

不,样式参数也影响日期到字符串的转换。 – 2014-09-25 14:55:48

0

这是一个SSRS错误。您正尝试使用无法转换为DateTime的字符串填充DateTime参数。

当您在ssrs数据集查询设计器中运行查询并获取参数的弹出窗口时,请输入有效的参数值而不是空白并尝试。

+0

选项卡感谢您的帮助。我很感激。我试过你的方式,它的工作,但现在另一个参数正在打破,所以试图解决这个问题。但是非常感谢你。 – peggy83 2014-09-26 18:05:10