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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sql server2012存储过程参数传递null值,如何判定这个参数是null相关的知识,希望对你有一定的参考价值。

存储过程写
if @para is null
Begin
select语句条件相当于where 1=1
End
else
Select语句
为什么参数传递null值时没有返回任何结果,print @para也是空,参数给定一个之正常.不能用@para is null或者isnull(@para,'')=''还能用什么方法判定@para是传递null值,这是bug吗

你的返回结果是什么意思?
当@para传入null时,print当然为空的了。
判断一个变量或字段值是否为空就是用is null来判断的:如果变量或字段值为null结果为true, 否则为false;而isnull则是在第一个参数值为null时返回第二个参数值,如果第一个参数值不为null则直接返回第一个参数值。
参考技术A ISNULL(@para,'') = ''

@para IS NULL追问

都不好用呢

追答

if ISNULL(@para,'') = ''
Begin
select语句条件相当于where 1=1
End
else
Select语句

追问

知道什么问题了,where @para is null造成不能查询的,谢谢!

追答

采纳吧!

本回答被提问者和网友采纳
参考技术B 你确定传的是NULL而不是'NULL'? 参考技术C 2012可以调试了,你调试一下存储过程。

SQL Server 存储过程参数 - 不同类型

【中文标题】SQL Server 存储过程参数 - 不同类型【英文标题】:SQL Server stored procedure parameters-DIFFERENT types 【发布时间】:2016-05-13 14:49:03 【问题描述】:

通过开发应用程序。我需要一个动态存储过程,我在其中调用表名(@pxxx),并且我还需要传递相同的参数 - 这里我有 2 个(datum,por)。 它运行良好,将表名传递为@pxxx - 好的。此外,当参数 datum,por 为 -int 或 varchar,或 char 或它们的组合时。 Int 我通过 CONVERT 更改为 varchar - 过程顺利。好吧,我会从 C# 调用。 问题是当我将参数 -datum 更改为 datetime 时。它不工作。通过“转换”更改日期为 varchar 没有帮助。它在 sql management studio 中不起作用。我需要解决一个问题,因为我需要在表数据[datetime]中, 我无法更改表定义,需要日期时间。 几乎所有关于传递参数和动态sql存储过程的问题都找了一遍,但没有找到解决办法。

MS SQL 2005 中的表定义:

   CREATE TABLE [dbo].[p001](
   [id] [bigint] IDENTITY(1,1) NOT NULL,
   [datum] [datetime] NULL,
   [por] [int] NULL,
   [cas] [nchar](5) NULL,
   [max] [int] NULL,
   [obsad] [int] NULL,
   [blok] [bit] NULL
   one of it ) ON [PRIMARY]

我的存储过程 - 不工作

 ALTER PROCEDURE [dbo].[SPinsertpxx2] (@pxxx nchar(4),@date datetime, @por int) 
 AS
  DECLARE @sqlCommand varchar(500)
  SET @sqlCommand =  'INSERT INTO '+ @pxxx +' ([datum],[por]) VALUES('
  +CONVERT(VARCHAR,@date,112)+','+CONVERT(VARCHAR,@por,5)+')'
  BEGIN
  EXEC (@sqlCommand)
  END

这个存储过程 - 运行良好,但只有没有 datetime 参数。

 ALTER PROCEDURE [dbo].[SPinsertpxxx] (@pxxx nchar(4),@cas nvarchar(10), @por int) 
AS
 DECLARE @sqlCommand varchar(500)
 SET @sqlCommand =  'INSERT INTO '+ @pxxx +' ([cas],[por]) VALUES('
 +CONVERT(VARCHAR,@cas)+','+CONVERT(VARCHAR,@por)+')'
    BEGIN
     EXEC (@sqlCommand)
    END 

【问题讨论】:

没有帮助,所以 114,或者将语言更改为英国。 Error msg>从字符串转换日期时间时失败。我在动态 sql 命令中的相同位置必须是字符串(varchar)。因此,我通过 CONVERT(VARCHAR,@parameter) 转换每个参数,它对 int 有帮助,但对 datetime 没有帮助 这里有几个问题。首先,您应该参数化您的动态 sql 以帮助防止 sql 注入。此外,您正在转换为 varchar 但未指定长度。我的问题是,如果您要插入日期时间列,为什么要传递 varchar?您还需要定义“不工作”。这是什么意思? 因为如果我将更改程序更改为“@datum datetime”,我会收到错误。 您分享错误信息而不是让我们猜测如何?我的猜测是,如果您使用参数化动态 sql,则该错误将不再发生。 【参考方案1】:

这是一个使用参数化动态 sql 执行此操作的工作示例。这有助于防止 sql 注入并允许您使用正确类型的参数。

create PROCEDURE [dbo].[SPinsertpxx2] 
(
    @pxxx nchar(4)
    , @datum datetime
    , @por int
) AS
    DECLARE @sqlCommand nvarchar(max)

    SET @sqlCommand =  'INSERT INTO '+ @pxxx +' ([datum],[por]) VALUES(@datum, @por)'

    exec sp_executesql @sqlCommand, N'@datum datetime, @por int', @datum = @datum, @por = @por

现在来测试一下,看看它是否有效。

exec SPinsertpxx2 'p001', '2016-01-01', 42

表格是否包含正确的值?

select * from p001

【讨论】:

现在工作。重启后……非常感谢。

以上是关于Sql server2012存储过程参数传递null值,如何判定这个参数是null的主要内容,如果未能解决你的问题,请参考以下文章

带参数的ms sql server的扩展存储过程,怎么传递参数

在 Sql Server 中将 xml 文档作为存储过程的参数传递是不是安全?

SQL Server--你可能不知道的技术细节:存储过程参数传递的影响

SQL Server 存储过程参数 - 不同类型

如何使用 JDBC 将表值参数(类数组参数)传递给 Microsoft SQL Server 2008 R2 中的存储过程? [复制]

SQL Server 如何执行 带参数的 存储过程