我正在努力使用T-sql程序,我希望你能提供帮助.
我需要知道是否
>表中存在给定ID的行
>如果存在一个(或多个),则最新的一个将另一个ID设置为5.
因此,我们需要获取行的第一个表有两个相关的ID:CaseID和LocationID,这些都是整数.第二个表有一个名为StateID的相关ID.
目前我可以判断该行是否存在于表部分中,但是当我尝试执行任何操作时,Enterprise Manager会在END语句之前给出语法错误.
CREATE PROCEDURE [dbo].[HasActiveCase] ( @LocationID INTEGER ) AS DECLARE @CaseID AS INTEGER SELECT @CaseID=CaseID FROM dbo.Cases WHERE @LocationID=LocationID SELECT CASE WHEN @CaseID IS NULL THEN 0 ELSE -- do something here to check CaseEvents.StateID is not 5 (closed) END GO
可能有一种方法可以在JOIN或其他东西中获得我需要的东西,但我在这里是一个完整的新手.
检查StateID最简单(理解)的方法不是5并将结果作为true / false返回? (我知道sqlServer没有布尔类型,但确实有Bit类型.)
另外在样式问题上:ID中的值具有与之关联的文本字段 – 例如,CaseEvents.StateID的文本为“已关闭”.我应该将值作为ID返回,然后替换代码中的ID或返回ID已经替换为文本的对象吗?在一组中永远不会有超过20或30个结果返回,并且该表永远不会非常大,因为花费5年才能获得2000个结果.
注意:不能使用linq(或任何其他.NETty),因为这将从VB6程序调用.
更新:
一次只能打开一个案例,因此只有最新的项目才有意义.
可能的情况是:
>没有案件开过.这应该返回0.
>案件先前已经开启,但现已关闭.这也应该返回0.
>存在已打开的案例.这应该返回1.
解决方法
我认为这个查询会做你想要的;请注意,您现有的查询存在一个错误,如果存在多个案例,它将仅检查初始查询选择的任何案例是否已关闭(当然,只有在可能有多个案例时才会出现这种情况)分配到特定位置).
SELECT @CaseID = dbo.Cases.CaseID FROM dbo.Cases JOIN dbo.CaseEvents ON dbo.Cases.CaseEventID = dbo.CaseEvents.CaseEventID WHERE @LocationID = dbo.Cases.LocationID AND 5 != dbo.CaseEvents.StateID SELECT CASE WHEN @CaseID IS NULL THEN CAST(0 AS BIT) ELSE CAST(1 AS BIT) END AS CaseExists