我不知道为什么我的代码试图将变量中的查询转换为数据类型INT
。更令人陌生的是,我在Linqpad上运行的代码很好。然后我将代码粘贴到Report Builder 3.0中并在查询视图中再次进行测试,该工作正常。接下来,我去报告视图并运行一次。这也很好。 然而 ,一旦我使用新的指定参数再次运行它,它就会抛出错误并告诉我检查本地计算机。
代码:
DECLARE @item varchar(50) = '%'
DECLARE @lp varchar(50) = '1231888'
DECLARE @loc varchar(10) = '%'
DECLARE @lot varchar(30) = '%'
DECLARE @trans_type varchar(2) = '%'
DECLARE @desc varchar(20) = '%'
DECLARE @whse varchar(4) = '%'
DECLARE @u_m varchar(20) = '%'
DECLARE @emp_num varchar(20) = '%'
DECLARE @ref_num varchar(20) = '%'
DECLARE @fglot varchar(20) = '%'
DECLARE @shift varchar(20) = '%'
DECLARE @truckid varchar(20) = '%'
DECLARE @trans_date datetime2 = NULL
DECLARE @trans_date_string varchar(10) = CAST(@trans_date AS nvarchar(10))
DECLARE @shiftdate datetime2 = NULL
DECLARE @shiftdate_string varchar(10) = CAST(@shiftdate AS nvarchar(10))
DECLARE @createdate datetime2 = NULL
DECLARE @createdate_string varchar(19) = CAST(@createdate AS nvarchar(19))
DECLARE @ref_line_suf int = 4
DECLARE @ref_line_suf_string varchar(2) = CAST(@ref_line_suf AS varchar(2))
DECLARE @qty decimal = NULL
DECLARE @qty_string varchar(30) = CAST(@qty AS varchar(30))
--Define query
DECLARE @query as nvarchar(2500)
SET @query =
'SELECT TOP (10000)
*
FROM
isw_lptrans AS t
WHERE
1=1'
+ CASE
WHEN @item = '%' OR @item = ''
THEN ''
ELSE ' AND t.item LIKE ' + '''' + @item + ''''
END
+ CASE
WHEN @lp = '%' OR @lp = ''
THEN ''
ELSE ' AND t.lp_num LIKE ' + '''' + '%' + @lp + '%' + ''''
END
+ CASE
WHEN @loc = '%' OR @loc = ''
THEN ''
ELSE ' AND t.loc = ' + '''' + @loc + ''''
END
+ CASE
WHEN @lot = '%' OR @lot = ''
THEN ''
ELSE ' AND t.lot = ' + '''' + @lot + ''''
END
+ CASE
WHEN @trans_type = '%' OR @trans_type = ''
THEN ''
ELSE ' AND t.trans_type = ' + '''' + @trans_type + ''''
END
+ CASE
WHEN @desc = '%' OR @desc = ''
THEN ''
ELSE ' AND t.description LIKE ' + '''' + '%' + @desc + '%' + ''''
END
+ CASE
WHEN @whse = '%' OR @whse = ''
THEN ''
ELSE ' AND t.whse = ' + '''' + @whse + ''''
END
+ CASE
WHEN @u_m = '%' OR @u_m = ''
THEN ''
ELSE ' AND t.u_m = ' + '''' + @u_m + ''''
END
+ CASE
WHEN @emp_num = '%' OR @emp_num = ''
THEN ''
ELSE ' AND t.emp_num = ' + '''' + @emp_num + ''''
END
+ CASE
WHEN @ref_num = '%' OR @ref_num = ''
THEN ''
ELSE ' AND t.ref_num = ' + '''' + @ref_num + ''''
END
+ CASE
WHEN @fglot = '%' OR @fglot = ''
THEN ''
ELSE ' AND t.fglotcode = ' + '''' + @fglot + ''''
END
+ CASE
WHEN @shift = '%' OR @shift = ''
THEN ''
ELSE ' AND t.uf_shift = ' + '''' + @shift + ''''
END
+ CASE
WHEN @truckid = '%' OR @truckid = ''
THEN ''
ELSE ' AND t.uf_truckid = ' + '''' + @truckid + ''''
END
+ CASE
WHEN @trans_date IS NULL
THEN ''
ELSE ' AND t.trans_date = ' + '''' + @trans_date_string + ''''
END
+ CASE
WHEN @shiftdate IS NULL
THEN ''
ELSE ' AND t.uf_shift_start_date = ' + '''' + @shiftdate_string + ''''
END
+ CASE
WHEN @createdate IS NULL
THEN ''
ELSE ' AND (t.createdate BETWEEN ' + '''' + CAST(DATEADD(hh, -24, @createdate) AS varchar(19)) + '''' + ' AND ' + '''' + CAST(DATEADD(hh, 24, @createdate) AS varchar(19)) + '''' + ' ) '
END
+ CASE
WHEN @ref_line_suf IS NULL
THEN ''
ELSE ' AND t.ref_line_suf = ' + @ref_line_suf_string
END
+ CASE
WHEN @qty IS NULL
THEN ''
ELSE ' AND t.qty = ' + @qty_string
END
;
print @query
EXEC sp_executesql @query
错误屏幕截图:
使用创建问题的参数查询打印输出(注意:这是来自Linqpad,没有问题。报表生成器3.0中出现问题):
SELECT TOP (10000)
*
FROM
isw_lptrans AS t
WHERE
1=1 AND t.lp_num LIKE '%1231888%' AND t.ref_line_suf = 4
答案 0 :(得分:2)
这应该适用于2008年。
DECLARE @item varchar(50) = '1'
DECLARE @lp varchar(50) = '1231888'
DECLARE @loc varchar(10) = '2'
DECLARE @lot varchar(30) = '3'
DECLARE @trans_type varchar(2) = '4'
DECLARE @desc varchar(20) = '5'
DECLARE @whse varchar(4) = '6'
DECLARE @u_m varchar(20) = '7'
DECLARE @emp_num varchar(20) = '8'
DECLARE @ref_num varchar(20) = '9'
DECLARE @fglot varchar(20) = '10'
DECLARE @shift varchar(20) = '11'
DECLARE @truckid varchar(20) = '12'
DECLARE @trans_date datetime2 = '2015-01-01'
DECLARE @shiftdate datetime2 = '2015-01-01'
DECLARE @createdate datetime2 = '2015-01-01'
DECLARE @ref_line_suf int = 4
DECLARE @qty decimal(15,5) = 5.2678
--Define query
DECLARE @query NVARCHAR(MAX)
SET @query =
'SELECT TOP (10000)
*
FROM isw_lptrans AS t
WHERE 1=1'
;
SET @query =
@query
+ISNULL(' AND t.item LIKE '''+CASE WHEN @item IN ('','%') THEN NULL ELSE @item END+'''','')
+ISNULL(' AND t.lp LIKE ''%'+CASE WHEN @lp IN ('','%') THEN NULL ELSE @lp END+'%''','')
+ISNULL(' AND t.loc = '''+CASE WHEN @loc IN ('','%') THEN NULL ELSE @loc END+'''','')
+ISNULL(' AND t.lot = '''+CASE WHEN @lot IN ('','%') THEN NULL ELSE @lot END+'''','')
+ISNULL(' AND t.trans_type = '''+CASE WHEN @trans_type IN ('','%') THEN NULL ELSE @trans_type END+'''','')
+ISNULL(' AND t.desc LIKE ''%'+CASE WHEN @desc IN ('','%') THEN NULL ELSE @desc END+'%''','')
+ISNULL(' AND t.whse = '''+CASE WHEN @whse IN ('','%') THEN NULL ELSE @whse END+'''','')
+ISNULL(' AND t.u_m = '''+CASE WHEN @u_m IN ('','%') THEN NULL ELSE @u_m END+'''','')
+ISNULL(' AND t.emp_num = '''+CASE WHEN @emp_num IN ('','%') THEN NULL ELSE @emp_num END+'''','')
+ISNULL(' AND t.ref_num = '''+CASE WHEN @ref_num IN ('','%') THEN NULL ELSE @ref_num END+'''','')
+ISNULL(' AND t.fglot = '''+CASE WHEN @fglot IN ('','%') THEN NULL ELSE @fglot END+'''','')
+ISNULL(' AND t.shift = '''+CASE WHEN @shift IN ('','%') THEN NULL ELSE @shift END+'''','')
+ISNULL(' AND t.truckid = '''+CASE WHEN @truckid IN ('','%') THEN NULL ELSE @truckid END+'''','')
+ISNULL(' AND t.trans_date = '''+CONVERT(VARCHAR(10),@trans_date)+'''','')
+ISNULL(' AND t.uf_shift_start_date = '''+CONVERT(VARCHAR(10),@shiftdate)+'''','')
+ISNULL(' AND t.createdate BETWEEN '''+CONVERT(VARCHAR(19),DATEADD(hour,-24,@createdate))+''' AND '''+CONVERT(VARCHAR(19),DATEADD(hour,24,@createdate))+'''','')
+ISNULL(' AND t.ref_line_suf = '+CONVERT(VARCHAR(2),@ref_line_suf),'')
+ISNULL(' AND t.qty = '+CONVERT(VARCHAR(30),@qty)+'''','')
;
print @query;