调用存储过程、传递 NULL 值、处理布尔值

Posted

技术标签:

【中文标题】调用存储过程、传递 NULL 值、处理布尔值【英文标题】:Calling stored procedures, passing NULL values, dealing with boolean values 【发布时间】:2010-01-21 21:38:13 【问题描述】:

当调用存储过程时,我将值连接在一起,我的问题是如何调用存储过程但在其中一个参数中发送“NULL”值?

假设 AID = null,但如果我将它传递给我的查询我会收到错误?!

QueryConn.Execute("Search_Res " & Count & "," & AccessList("InvoiceLevel") & "," & AID)

好的,所以我的下一个问题是如何传入布尔变量?

在我的存储过程中,var @SearchChildren 要么为真要么为假,但我该如何定义它,或者我应该使用 int 并让事情变得简单,只使用 0 或 1?

MS SQL Server 2005。

【问题讨论】:

【参考方案1】:

看起来您正在尝试使用临时查询而不是 ADO.Net DBCommand 对象来执行 SP。你不能在你的字符串中添加“@SearchChildren = null”吗?

您也可以使用命令对象显式设置参数值,相对简单。

SqlCommand cmd = new SqlCommand("Search_Res", QueryConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@SearchChildren", DBNull.Value);
..
..
values = cmd.Execute();

对不起,C#……我的 VB 生锈了。

【讨论】:

【参考方案2】:

Search_Res 存储过程的参数更改为可选。 @参数=空。当传递 NULL 值时,该参数被忽略。

CREATE PROCEDURE dbo.foo 
    @param INT = NULL 
AS 
BEGIN ...

【讨论】:

实际上这是我使用的答案的基础,所以我得到了“勾号”。感谢所有回答的人。【参考方案3】:

在这种情况下,由于您将过程调用和参数作为文字传递,因此您希望 AID 包含字符串值“null”,而不是 null 值。

或者,您应该考虑使用绑定参数。看起来您的调用语言是 VB.NET,所以我不完全知道如何使用该语言执行此操作,但有很多参考资料。

我没有使用过 SQL Server,但我知道在 Oracle 中将布尔变量传递给存储过程基本上是非法的。建议使用具有 0 或 1 值的 INT。

【讨论】:

以上是关于调用存储过程、传递 NULL 值、处理布尔值的主要内容,如果未能解决你的问题,请参考以下文章

Sql server2012存储过程参数传递null值,如何判定这个参数是null

使用空参数和 SqlDataAdapter 调用存储过程

oracle中调用存储过程时传递参数值的3种方式。。

存储过程禁止空参数

使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程

MySQL 存储过程传参之in, out, inout 参数用法