SQL Select查询中的荒谬之处

时间:2013-07-23 06:18:21

标签: sql-server

我有这样的查询:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[User_SelectByLoginID]
@LoginID nvarChar(4)
as
SELECT dbo.[User].*
FROM  dbo.[User]
WHERE LoginID=@LoginID

用户表中的数据:

LoginID ='1111'  |  Name ='abc'  |  Email = 'abc@yahoo.com'

当我执行此查询并输入'1111111'时,它返回了记录:

1111    abc    abc@yahoo.com

当我输入错误的LoginID并仍然获得数据时,这很荒谬。

P / S:我设置了LoginID nvarchar(4)

有人可以帮我解释一下吗?以及如何做到对不对?

2 个答案:

答案 0 :(得分:4)

如果将@LoginID设置为nvarchar(4),它将截断为该大小,因此实际上您传入的是1111而不是11111111。

答案 1 :(得分:2)

SQL Server以静默方式截断传递给存储过程的值,因此即使传递值“1111111”,它也会被切断为声明的长度(4),因此在存储过程中存在值“1111”。

因此,您应该将参数@LoginID声明为与User表中的LoginID列相同的大小