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