Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server If语句有问题_Sql Server_Sql Server 2008_Stored Procedures_If Statement - Fatal编程技术网

Sql server SQL Server If语句有问题

Sql server SQL Server If语句有问题,sql-server,sql-server-2008,stored-procedures,if-statement,Sql Server,Sql Server 2008,Stored Procedures,If Statement,我在以下存储过程中遇到了一些问题 Create PROCEDURE GetMatchingUsers @id int = NULL, @lastName varchar(50) = NULL, @firstName varchar(50) = NULL AS BEGIN SET NOCOUNT ON DECLARE @q nvarchar(4000), @paramlist nvarchar(4000) SELECT @q = 'SELECT Id , LastNa

我在以下存储过程中遇到了一些问题

Create PROCEDURE GetMatchingUsers
@id int = NULL,
@lastName varchar(50) = NULL,
@firstName varchar(50) = NULL
AS
BEGIN

 SET NOCOUNT ON

 DECLARE @q nvarchar(4000),
 @paramlist  nvarchar(4000)  

    SELECT @q = 'SELECT Id
  , LastName
  , FirstName '
 SELECT @q = @q + 'FROM Users WHERE 1 = 1' 

 IF ISNULL(@id, '')  <> ''                                 
  SELECT @q = @q + ' AND Id = ' + Cast(@id as varchar)
 IF ISNULL(@lastName, '')  <> ''                                           
  SELECT @q = @q + ' AND LastName like ''' + @lastName + '%''' 
 IF ISNULL(@firstName, '')  <> ''                                           
  SELECT @q = @q + ' AND FirstName like ''' + @firstName + '%'''   

 SELECT @q = @q + ' ORDER BY LastName, FirstName '

 --PRINT @q

 SELECT @paramlist = '
  @id int = NULL,
  @lastName varchar(50) = NULL,
  @firstName varchar(50) = NULL'

 EXEC sp_executesql @q, @paramlist,                               
   @id,
   @lastName,
   @firstName
创建过程GetMatchingUsers
@id int=NULL,
@lastName varchar(50)=空,
@firstName varchar(50)=空
作为
开始
不计较
声明@q nvarchar(4000),
@paramlist nvarchar(4000)
选择@q=”选择Id
,姓
,名字'
从1=1的用户中选择@q=@q+'
如果为空(@id,)“”
选择@q=@q+'和Id='+Cast(@Id为varchar)
如果为空(@lastName,“”)
选择@q=@q+'和类似于''+@LastName+'%''的LastName
如果为空(@firstName,“”)
选择@q=@q+'和类似于''+@FirstName+'%''的FirstName
选择@q=@q+“按姓氏、姓氏排序”
--打印@q
选择@paramlist=
@id int=NULL,
@lastName varchar(50)=空,
@firstName varchar(50)=空'
EXEC sp_executesql@q、@paramlist、,
@身份证,
@姓,
@名字
我想知道,如果我将0作为id传递,为什么下面的if语句不被认为是真的

IF ISNULL(@id, '')  <> ''                                 
    SELECT @q = @q + ' AND Id = ' + Cast(@id as varchar)
如果为空(@id,)“”
选择@q=@q+'和Id='+Cast(@Id为varchar)

感谢您的帮助

零和空不是一回事。Null或多或少表示没有任何值。零是一个值

如果您希望0是一个值,您可以将其传递到与传递NULL时相同的工作状态(即,如果将其赋予0,则不进行选择),请执行以下操作:

IF ISNULL(@id, 0)  <> 0                                 
    SELECT @q = @q + ' AND Id = ' + Cast(@id as varchar)
如果ISNULL(@id,0)0
选择@q=@q+'和Id='+Cast(@Id为varchar)

零与空不是一回事。Null或多或少表示没有任何值。零是一个值

如果您希望0是一个值,您可以将其传递到与传递NULL时相同的工作状态(即,如果将其赋予0,则不进行选择),请执行以下操作:

IF ISNULL(@id, 0)  <> 0                                 
    SELECT @q = @q + ' AND Id = ' + Cast(@id as varchar)
如果ISNULL(@id,0)0
选择@q=@q+'和Id='+Cast(@Id为varchar)

这很奇怪-这可能与您将int和string文本混为一谈有关。如果@id为null,则执行
似乎更简单,如果@id不为null,则执行
似乎更简单,具体取决于您的需求

我用一个简单的例子再现了这一点(我将
更改为
=
,使逻辑更加明显):


您可能希望它打印“false”,但它打印“true”。如果您将@id的值设置为1,那么它的行为将与预期的一样。

这很奇怪-这可能与您将int和string文本混合在一起这一事实有关。如果@id为null,则执行
似乎更简单,如果@id不为null,则执行
似乎更简单,具体取决于您的需求

我用一个简单的例子再现了这一点(我将
更改为
=
,使逻辑更加明显):


您可能希望它打印“false”,但它打印“true”。如果将@id的值设置为1,则其行为将与预期的一样。

NULL表示未知,而不是零。所以

如果@id>0

应该有用。但我不会构建字符串,而是将其重写为:

SELECT Id 
  , LastName 
  , FirstName 
FROM Users
WHERE id = @id or
(@lastName is null or LastName like @lastName+'%') or
(@firstName is null or FirstName like @firstName+'%') 
ORDER BY LastName, FirstName 
下面是相同的,但较少自我记录

SELECT Id 
  , LastName 
  , FirstName 
FROM Users
WHERE id = @id or
LastName like @lastName+'%' or
FirstName like @firstName+'%' 
ORDER BY LastName, FirstName 

NULL表示未知,而不是零。所以

如果@id>0

应该有用。但我不会构建字符串,而是将其重写为:

SELECT Id 
  , LastName 
  , FirstName 
FROM Users
WHERE id = @id or
(@lastName is null or LastName like @lastName+'%') or
(@firstName is null or FirstName like @firstName+'%') 
ORDER BY LastName, FirstName 
下面是相同的,但较少自我记录

SELECT Id 
  , LastName 
  , FirstName 
FROM Users
WHERE id = @id or
LastName like @lastName+'%' or
FirstName like @firstName+'%' 
ORDER BY LastName, FirstName 
这不应该让任何人感到惊讶,所有这些都记录在产品规范中:

  • 用于返回选中表达式的类型,而不是替换表达式的类型。因此,
    isnull(@id,”)
    将返回0作为类型
    int
  • 如果0=''
则比较
将遵循的规则并转换为更高的优先级类型,在本例中为
int
  • 转换为int值的字符串“”等于
    转换(“”为int)
    ,为0 因此,如果0=0,那么比较实际上与编写
    是一样的,这当然是正确的。q、 急诊室

    这不应该让任何人感到惊讶,所有这些都记录在产品规范中:

    • 用于返回选中表达式的类型,而不是替换表达式的类型。因此,
      isnull(@id,”)
      将返回0作为类型
      int
    • 如果0=''
    则比较
    将遵循的规则并转换为更高的优先级类型,在本例中为
    int
  • 转换为int值的字符串“”等于
    转换(“”为int)
    ,为0
    因此,如果0=0,那么比较实际上与编写
    是一样的,这当然是正确的。q、 e.d.

    如果传入的id为0,我实际上希望它连接字符串。我唯一不希望它进入到块中的时间是如果id根本没有传入。然后将上面的0更改为-1(即:ISNULL(@id,-1)-1如果传入的id为0,我实际上希望它连接字符串。我唯一不希望它进入到块中的时间是如果id根本没有传入。然后将上面的0更改为-1(即:ISNULL(@Id,-1)-1