处理一个项目,该项目需要2个不同的表格,将一个数字分配给一个公共变量。我可以得到0和1工作,但值2将无法工作。我错过了什么?
declare @rtval int
, @primarykey nvarchar(25)
BEGIN TRY
BEGIN
set @primarykey = ( select top 1 2
from dbo.firsttable ftv
where ftv.field = @ftvID
and ftv.Target like 'CASE1'
)
set @primarykey = ( select top 1 1
from dbo.secondtable fv
join dbo.external ext on fv.external1 = ext.xID
where fv.yID = @yID
and fv.Target1 like 'CASE2'
)
if ISNUMERIC(@primarykey) = 1
begin set @rtval = convert (int, @primarykey)
end
else
begin set @rtval = 0
end
我可以让0和1工作,但永远不会2.我有什么东西丢失了吗?
答案 0 :(得分:0)
我不确定此代码将如何返回2。我想你想要这样的......
DECLARE @rtval INT = CASE
WHEN EXISTS(
SELECT *
FROM dbo.firsttable ftv
WHERE ftv.field = @FTVID
AND ftv.target LIKE 'CASE1'
) THEN 2
WHEN EXISTS(
SELECT *
FROM dbo.secondtable fv
JOIN dbo.external ext on fv.external1 = ext.xID
WHERE fv.yID = @yID
AND fv.Target1 LIKE 'CASE2'
) THEN 1
ELSE
0
END ;
如果您使用的是旧版本的SQL Server,则可能需要单独从SET或SELECT声明@rtval以填充它。
我假设您在检查CASE2之前要检查CASE1。如果没有,只需颠倒WHEN条款的顺序。
另外,在没有任何通配符的情况下执行LIKE是一个直接的相等检查,因此用LI替换LIKE可能更有效。