SQL: @query 中存储的查询不断尝试转换为数据类型 INT

SQL: Query stored in @query keeps trying to convert to data type INT

我不知道为什么我的代码试图将变量内的查询转换为数据类型 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,没有问题。问题出现在Report Builder 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

这应该适用于 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;