在查询中使用变量不会得到结果。真正的价值。为什么?

时间:2019-07-25 06:29:46

标签: sql sql-server variables select

具有3个变量的存储过程会对它们执行CREATE TYPE [dbo].[T_Code_Dossier] FROM [nchar](6) NOT NULL CREATE TYPE [dbo].[T_Code_Detail] FROM [nchar](3) NOT NULL CREATE TYPE [dbo].[T_Code_DetailSub] FROM [nchar](3) NOT NULL
没有结果。

将变量更改为文字值确实会得到结果。
为什么?

declare 
   @DossierCode T_Code_Dossier = 779,
   @DetailCode T_Code_Detail = 10,
   @DetailSubCode T_Code_DetailSub = 0
SELECT
   t1.PartCode,
   t1.SalesUnitType,
   t1.CalcQty,
   t1.Length,
   t1.Width,
   t1.Height,
   t1.SalesUnitOfAccount
FROM dbo.T_DossierDetail  AS t1
WHERE
   t1.DossierCode = @DossierCode AND 
   t1.DetailCode = @DetailCode AND 
   t1.DetailSubCode = @DetailSubCode
SELECT
   t1.PartCode,
   t1.SalesUnitType,
   t1.CalcQty,
   t1.Length,
   t1.Width,
   t1.Height,
   t1.SalesUnitOfAccount
FROM dbo.T_DossierDetail  AS t1
WHERE
   t1.DossierCode = 779 AND 
   t1.DetailCode = 10 AND 
   t1.DetailSubCode = 0

没有结果。

jsObject = JSON.parse(JSON.stringify(jsObject), (key, value) => {
               if (value == null || value == '' || value == [] || value == {})
                   return undefined;
               return value;
           });

1个结果。

为什么?

2 个答案:

答案 0 :(得分:0)

尝试一下。...

    declare 
   @DossierCode int = 779,
   @DetailCode int = 10,
   @DetailSubCode int = 0


      SELECT
         t1.PartCode,
         t1.SalesUnitType,
         t1.CalcQty,
         t1.Length,
         t1.Width,
         t1.Height,
         t1.SalesUnitOfAccount
      FROM dbo.T_DossierDetail  AS t1
      WHERE
      t1.DossierCode = @DossierCode AND 
      t1.DetailCode = @DetailCode AND 
      t1.DetailSubCode = @DetailSubCode

如果这可行,则可能的原因是在查询中您将int值传递给where子句中的字段,而在过程中,您使用自定义数据类型声明了变量。可能会出现不匹配的情况。

修改

SQL Server的隐式转换太多了。
我建议您始终在字符串和数字之间使用显式转换,以使代码更清晰。

答案 1 :(得分:0)

主要是由于您的数据和No Result查询。通过使用字符串数据类型存储数字值,您可能会以0____0_甚至甚至是__0

结尾

因此您对WHERE的查询t1.DetailSubCode = @DetailSubCode子句可能没有任何匹配项。

但是,使用t1.DetailSubCode = 0会强制表DetailSubCode中的值在比较之前执行隐式转换为整数。因此,在这种情况下,所有这些值0____0_甚至__0都将转换为数字0并进行比较并匹配

执行以下查询并查看区别

declare @tbl table
(
    id  int identity,
    col1    nchar(3)
)

insert into @tbl select '0'
insert into @tbl select ' 0'
insert into @tbl select '  0'

declare @v nchar(3) = 0

-- your first only. Only 1 row return
select  *
from    @tbl
where   col1 = @v

-- your second query. All 3 rows return
select  *
from    @tbl
where   col1 = 0

参考:Data Type Conversion