变量未在SQL Query中正确传递

时间:2013-12-12 17:06:02

标签: sql-server-2008 tsql parameters

我很难过这个。可能是一个简单的问题,但我无法解决这个问题。

我有一个简单的查询,我将结果集合并在一起,以便根据不同的标准操作数据。

我有一个参数,所以最终可以成为SSRS报告。

这是我的精简查询...

有3个参数:StartDate,EndDate和Supplier。

StartDate和EndDate是数据类型日期,Supplier是char(7)

当我运行查询并将参数设置为'1040'时,我得不到结果

DECLARE @STARTDATE AS DATE
DECLARE @ENDDATE AS DATE
DECLARE @SUPPLIER AS CHAR

SET @STARTDATE = '2013-12-01'
SET @ENDDATE = '2013-12-31'
SET @SUPPLIER = '1040'

SELECT *
  FROM InvMovements AS AA
  JOIN InvMaster AS BB
    ON AA.StockCode = BB.StockCode
  JOIN ApSupplier AS CC
    ON CC.Supplier = BB.Supplier
 WHERE MovementType = 'I'
   AND TrnType = 'T'
   AND TrnQty < 0
   AND Warehouse = 'ZC'
   AND CC.Supplier = @SUPPLIER 
   AND EntryDate BETWEEN @STARTDATE AND @ENDDATE

现在,当我更改WHERE子句以显示任何供应商(如参数(CC.Supplier LIKE'%'+ @SUPPLIER +'%'))时,我得到了这些结果

Supplier    StockCode   Warehouse   EntryDate   TrnType    TrnQty
1000        317012      ZC          2013-12-06  T          18.000
1040        320062      ZC          2013-12-06  T           8.000

我们只有4个角色供应商。

如果我手动将供应商设置为CC.Supplier ='1040',我会得到我正在寻找的确切结果集。我在SSRS中尝试过它,我得到了相同的结果。

有什么想法吗?这似乎是一个愚蠢的问题,但我似乎无法弄清楚为什么会发生这种情况。

1 个答案:

答案 0 :(得分:3)

如果你这样做:

DECLARE @SUPPLIER AS CHAR

然后你的变量正好一个字符长。

所以当你做分配时

SET @SUPPLIER = '1040'

你真的只是将1存储在该变量中。

定义时,您需要为CHARVARCHAR 提供明确的长度!您应该养成这样做的习惯 - 当您声明变量,向存储过程或函数声明参数时,或者在{{1}中使用CHARVARCHAR时}或CAST情况 - 定义长度!

CONVERT

然后按预期工作。