我需要在程序中返回true或false

时间:2014-03-16 07:05:39

标签: stored-procedures boolean return

我需要这个存储函数的帮助:

  1. 该函数应返回一个布尔值。
  2. 如果存在行,则给出几个参数,而不是返回True或1(False或Zero)。
  3. 功能必须接受2个参数。
  4. CREATE PROCEDURE ( @id varchar(12), @subvarchar(12))
    
    IF EXISTS(SELECT * FROM contacts WHERE id = @id AND subid = @subid )
    .....//return true else  ....//return false
    

    我需要返回true或false。

1 个答案:

答案 0 :(得分:1)

<强> TL; DR
我会使用一个函数(标量,或可能是表值,但这需要更改基于集合的方法)

SqlFiddle of the various options here

<强>详情
SQL Server中没有布尔类型 - 最接近的是BIT(0/1)。存储过程只能返回INT,尽管(ab)以这种方式使用返回值是不常见的,因为它旨在表明过程的成功或失败。

CREATE PROCEDURE dbo.MyProc( @key varchar(12), @subkey varchar(12)) AS
  RETURN (
    SELECT CASE
      WHEN exists
       (select * from contacts where [key]=@key and [subkey]=@subkey) 
        THEN 1 
        ELSE 0
      END);

更常见的是,您将使用OUTPUT参数:

CREATE PROCEDURE dbo.MyOutputParamProc( @key varchar(12), @subkey varchar(12), @result BIT OUTPUT) AS
  SET @result =
    CASE
      WHEN exists
       (select * from contacts where [key]=@key and [subkey]=@subkey) 
        THEN 1 
        ELSE 0
      END;
GO

或者,您可以SELECT一个结果,这将返回单行单列。

CREATE PROCEDURE dbo.MyProc( @key varchar(12), @subkey varchar(12)) AS
  SELECT CASE 
      WHEN exists
       (select * from contacts where [key]=@key and [subkey]=@subkey) 
        THEN 'true' 
        ELSE 'false'
      END AS 'Result';

也就是说,由于您不会更改数据,因此在这种情况下,用户定义函数可能优于PROC,例如:

CREATE FUNCTION dbo.MyFunc(@key varchar(12), @subkey varchar(12))
RETURNS BIT
AS BEGIN
  RETURN (SELECT CASE 
      WHEN exists(select * from contacts where [key]=@key and subkey=@subkey) 
        THEN 1 
        ELSE 0
      END);
END;

这样称呼:

SELECT dbo.MyFunc('key', 'subkey')

最后一点 - 如果您需要同时检索多个密钥,并且性能很重要,那么您可能还需要考虑以基于集合的方式处理此问题,例如:通过接受表值参数到proc / function。