【问题标题】:Ridiculous thing in SQL Select query [closed]SQL Select 查询中可笑的事情[关闭]
【发布时间】:2013-07-23 06:18:21
【问题描述】:

我有一个这样的查询:

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

以及User表中的数据:

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

当我执行这个查询并输入“1111111”时,它返回了记录:

1111    abc    abc@yahoo.com

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

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

谁能帮我解释一下?以及如何使它正确?

【问题讨论】:

  • 您是否只是想对 SQL Server 静默截断过长参数这一事实进行吐槽/发泄?还是您有实际问题?
  • 您可能想查看此answer 以获取连接项目的链接,这些项目要求 Microsoft 提供(选择加入)更严格的设置。
  • ID错了,但存储过程错了,所以它们在一起是对的!
  • @Damien_The_Unbeliever 这是我第一次遇到这个问题,所以我只想问清楚。不要那样消极地思考。谢谢!

标签: sql-server


【解决方案1】:

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

【讨论】:

  • 您能告诉我如何解决吗?或者我应该为 LoginID 使用哪种类型?
  • 你可以设置@LoginID大于4则不显示结果
  • 只是不要将 nvarchar 设置为 4(或任何值)或将其设置为高于输入长度的值。
  • @DinupKandel 哦,没错。谢谢
  • @andrew-buchan 你是说使用nvarchar 不带括号吗?这是一个巨大的错误,因为在各种情况下,它要么表示nvarchar(30),要么表示nvarchar(1)总是、总是、总是指定数据长度。在 SQL Server 中,没有无长度 char/varchar 参数的概念。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多