sql-server-2005 - 给出 bool 结果的 T-SQL 过程

标签 sql-server-2005 tsql

我正在努力处理 T-SQL 过程,希望您能提供帮助。

我需要知道是否

  1. 表中存在给定 ID 的行
  2. 如果确实存在一个(或多个),则最新的 ID 的另一个 ID 设置为 5。

因此,我们需要获取行的第一个表有两个相关的 ID:CaseID 和 LocationID,它们都是整数。第二个表有 1 个相关 ID,称为 StateID。

目前,我可以获取该行是否存在于表部分中,但当我尝试执行任何操作时,企业管理器会在 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 并将结果返回为真/假的最简单(易于理解)的方法是什么?(我知道 SQLServer 没有 bool 类型,但有而是使用 Bit 类型。)

还有一个风格问题:ID 中的值有一个与之关联的文本字段 - 例如 CaseEvents.StateID 具有文本“已关闭”。 我应该返回值作为 ID,然后替换代码中的 ID,还是返回 ID 已替换为文本的对象? 一组中返回的结果永远不会超过 20 或 30 个,并且表永远不会很大,因为需要 5 年才能获得 2000 个结果。

注意:不能使用 linq(或任何其他 .NETty),因为这将从 VB6 程序中调用。

更新:

一次只能打开 1 个案例,因此只有最新的项目才相关。

可能出现的情况是:

  1. 从未立案。这应该返回 0。
  2. 之前已立案,但现已结案。这也应该返回 0。
  3. 存在一个已打开的案例。这应该返回 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

关于sql-server-2005 - 给出 bool 结果的 T-SQL 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/756240/

相关文章:

sql-server - 是否有理由在可为空的列上指定 DEFAULT (NULL)?

sql - 如何删除FK和所有从属表条目?

mysql - T-SQL : calculate in dependence of the content of a column

xml - SQL Server 2005 - TSQL For Xml 查询以获取分组的部门和员工

sql - 我的 CASE 语句是错误的。知道我做错了什么吗?

sql-server - 将插入或更新另一个表的 SQL Server TRIGGER

sql - 从表中删除共享相同 ID 的所有行

sql-server - 如何计算 SQL 中另一列中每个值的众数

sql-server-2005 - 关于 SQL Server 删除触发器

sql-server-2005 - 有关查询优化的提示和技巧 [SQL Server 2005]