2017-09-03 44 views
1

我有一个名为UserList的表,它具有UserName和UserPassword列。当我查询如下,它工作并返回正确的数据。选择不适用于SQL Server 2017中的变量

SELECT * FROM dbo.UserList WHERE UserName = 'aliserin' 

但是,当我尝试它如下,它不给我任何结果。它只是返回空。它没有给出错误,但我真的不明白原因。如果它很重要,它是一个本地数据库。

declare 
@UserName as NVARCHAR 

SET 
@UserName = 'aliserin' 
SELECT * FROM dbo.UserList WHERE UserName = @UserName 

当我在下面的UserId约束上尝试相同的代码时,它可以工作。有谁知道为什么?

DECLARE @UserName1 AS NVARCHAR 

SET @UserName1 = 2 

SELECT * FROM dbo.UserList WHERE UserId = @UserName1 

回答

4

你需要指定一个长度参数为varchar类型:What is the effect of omitting size in nvarchar declaration

如果没有在数据定义或变量声明语句中指定n,则默认长度为1。当没有使用CAST函数指定n时,默认长度为30.

这意味着您的查询实际上是在做SELECT * FROM UserList WHERE UserName = 'a'

所以,你想:

DECLARE @userName AS nvarchar(8) 
SET @userName = 'aliserin' 
SELECT * FROM dbo.UserList WHERE UserName = @userName 

您也可以通过使用DECLARE =语法和省略AS关键字(我避免使用AS的类型,因为它是通常用来别名列名)

DECLARE @userName nvarchar(8) = 'aliserin' 
SELECT * FROM dbo.UserList WHERE UserName = @userName 
简化这个