I have a simple table with 4 rows as follows:
x
| person_ID | FirstName | LastName | Phone | Email |
+-----------+-----------+----------+------------+-----------------------+
| 1 | Ernaldo | Chin | 0000000000 | echin@blah.blah |
| 2 | Esmerelda | Chin | 1111111111 | echin@idk.org |
| 1002 | Terry | Bogard | 2222222222 | tbogard@fatalfury.com |
| 1003 | Captain | Falcon | 3333333333 | cfalcon@fzero.com |
When I run the following query the results are exactly as expected: Query
DECLARE @firstname varchar(50) = NULL,
@LastName varchar(50) = 'Chin',
@person_ID int = null,
@phone varchar(50) = null,
@email varchar(50) = null
SELECT
[person_ID], [FirstName], [LastName], [Phone], [Email]
FROM
[dbo].[Persons]
WHERE
(@person_ID IS NULL OR person_ID = @person_ID)
AND (@firstname IS NULL OR FirstName LIKE '%' + @firstname + '%')
AND (@LastName IS NULL OR LastName LIKE '%' + @LastName + '%')
Results
| person_ID | FirstName | LastName | Phone | Email |
+-----------+-----------+----------+------------+-----------------------+
| 1 | Ernaldo | Chin | 0000000000 | echin@blah.blah |
| 2 | Esmerelda | Chin | 1111111111 | echin@idk.org |
BUT I created a stored procedure as follows:
CREATE PROCEDURE [dbo].[Persons_Get]
@person_ID int = NULL,
@FirstName varchar = NULL,
@LastName varchar = NULL,
@Phone varchar = NULL,
@Email varchar = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT
[person_ID], [FirstName], [LastName], [Phone], [Email]
FROM
[dbo].[Persons]
WHERE
(@person_ID IS NULL OR person_ID = @person_ID)
AND (@Firstname IS NULL OR FirstName LIKE '%' + @Firstname + '%')
AND (@LastName IS NULL OR LastName LIKE '%' + @LastName + '%')
and execute it like this
EXEC Persons_Get @LastName = 'Chin'
I get these results
| person_ID | FirstName | LastName | Phone | Email |
+-----------+-----------+----------+------------+-----------------------+
| 1 | Ernaldo | Chin | 0000000000 | echin@blah.blah |
| 2 | Esmerelda | Chin | 1111111111 | echin@idk.org |
| 1003 | Captain | Falcon | 3333333333 | cfalcon@fzero.com |
Am I going crazy here? I’ve already spent way too much time on this. Is there something I’m doing wrong? I might end up using dynamic SQL instead but I need to know what I’m doing wrong here.
Advertisement
Answer
You MUST at all times specify an explicit length for any CHAR, NCHAR, VARCHAR, NVARCHAR
parameters! Otherwise they default to 1 character length!
Use this:
CREATE PROCEDURE [dbo].[Persons_Get]
@person_ID int = NULL,
@FirstName varchar(50) = NULL,
@LastName varchar(50) = NULL,
@Phone varchar(50) = NULL,
@Email varchar(255) = NULL
AS
and your stored procedure will work just fine