我需要这个存储函数的帮助:
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。
答案 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。