我想调用此过程发送一个可以为NULL或任何int值的值。
SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId =@SubDomainId
我只是想使用这个单一的查询而不是我现在在下面给出的代码中做的事情。
我搜索了这个怎么能这样做然后我得到this Link。
根据这个,我必须设置ANSI_NULLS OFF
在执行我的sql查询之前,我无法在此过程中设置此项,然后在执行此操作后再次重置它。
ALTER PROCEDURE [Tags].[spOnlineTest_SubDomainSelect]
@SubDomainId INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
IF @SubDomainId IS NULL
SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId IS NULL
ELSE
SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId =@SubDomainId
END
处理ANSI_NULLS或使用If If Else
的更好做法是什么答案 0 :(得分:8)
SET ANSI_NULLS在存储过程创建时定义,不能在运行时设置。
使用SET选项
数据库引擎保存设置 SET QUOTED_IDENTIFIER和SET 存储Transact-SQL时的ANSI_NULLS 过程已创建或修改。 这些原始设置用于 执行存储过程。 因此,任何客户端会话设置 对于SET QUOTED_IDENTIFIER和SET 存储时忽略ANSI_NULLS 程序正在运行。其他SET 选项,例如SET ARITHABORT,SET ANSI_WARNINGS或SET ANSI_PADDINGS 存储过程时不保存 已创建或修改。如果逻辑 存储过程取决于a 特殊设置,包括SET 声明开头的声明 保证适当的程序 设置。当SET语句是 从存储过程执行, 设置仅在有效期内保持有效 存储过程已完成 运行。然后恢复该设置 到存储过程的价值 什么时候叫它。这使得 个人客户设置选项 他们想要而不影响逻辑 存储过程。
在这种情况下,请使用IF ELSE,因为将来SET ANSI_NULLS ON 。
或Peter Lang的建议。
老实说,期待SubDomainId = @SubDomainId
在@SubDomainId为NULL时工作并不正确使用NULL ...
答案 1 :(得分:2)
你不能使用单个查询吗?
SELECT DomainName, DomainCode
FROM Tags.tblDomain
WHERE ( @SubDomainId IS NULL AND SubDomainId IS NULL )
OR ( SubDomainId = @SubDomainId )
答案 2 :(得分:0)
仅供参考,我很确定......
ANSI_NULLS OFF
在创建/编辑过程时适用于该过程,它类似于过程的设置。
因此,程序要么打开,要么关闭。你的例子是查询而不是程序,所以我有点困惑。
但是如果您有SQL 2005/2008,例如,如果您“编辑”过程,它会在新选项卡中打开您的过程,您会在顶部附近看到ANSI_NULLS OFF。
您可以在那里进行编辑并将其设置为ON或OFF并更新它以更改...