具有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个结果。
为什么?
答案 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