我一直在使用Visual Studio 2013制作一个简单的客户数据库,事情进展顺利。我有一个有效的搜索查询,但我现在正尝试将其用作存储过程。这是因为还有一点,但我只想先解决这个问题的基本版本。只有当变量@Name完全等于“Name”列中的名称时,Stored Procedure才会返回。
例如,搜索“And”应该返回名称以And开头的客户行,例如Andrew,但事实并非如此。在整个搜索“安德鲁”时它确实成功了。
ALTER PROCEDURE [dbo].[SP_CustomerQuery] (
@Name NCHAR(25) = NULL
)
AS
SELECT Name
,Surname
,Email
,MobileNo
,CustomerID
,PhoneNo
,AreaCode
,Address
,CompanyName
FROM CUSTOMERS
WHERE (@Name IS NULL OR Name LIKE @Name + '%')
我正在从Visual Studio中执行查询以进行调试,因此不是我的C#代码导致任何恶作剧。会喜欢一些帮助,因为我确信这是正确的查询。 (我也试过了
WHERE (@Name IS NULL OR Name LIKE '%' + @Name + '%')
答案 0 :(得分:1)
您正在传递NCHAR类型的参数 此类型的长度始终为25个字符
因此,当您实际传递"And"
时,SP会看到"And "
当然搜索失败了,而出于同样的原因" Andrew"的工作原理。
您应该更改自己的SP以获得NVARCHAR
但是,拥有一个NCHAR类型的列来存储Name数据似乎只是一个从一开始就要避免的问题。除非你有一个非常令人信服的理由要求所有相同长度的名字并填充空格,如果它们更短,那么我建议你将这个字段改为NVARCHAR。
您可以在此问题中了解有关NCHAR与NVARCHAR搜索问题的更多信息SQL Server char and nchar columns search differently