Tim*_*hoe 2 sql t-sql sql-server stored-procedures
此存储过程用于搜索记录.
当我只填写参数@ID或@FirstName,它的工作原理.但如果我只填写,请不要@LastName.
例如:
@ID = 1,其余的是NULL- >应该给1行 - >结果:1行(ok)
@ID = NULL, @FirstName = 'Tim',其余的是NULL- >应该给1行 - >结果:1行(ok)
@ID = NULL, @FirstName = NULL, @LastName = 'BlaBla',其余的是NULL
- >应该给1行 - > RESULT:所有行(不行)
谁知道为什么?
提前致谢.
这是我的程序:
ALTER PROCEDURE lookupSubscriber
-- Add the parameters for the stored procedure here
@ID int,
@firstname nvarchar(50),
@lastname nvarchar(60),
@street nvarchar(80),
@housenumber nvarchar(6),
@companyname nvarchar(50),
@city nvarchar(50),
@ResultString nvarchar(80) OUTPUT,
@ResultValue int OUTPUT,
@ResultCount int OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--Replacing empty strings with NULL
IF @ID = 0 BEGIN SET @ID = NULL; END
IF @firstname = '' BEGIN SET @firstname = NULL; END
IF @lastname = '' BEGIN SET @lastname = NULL; END
IF @street = '' BEGIN SET @street = NULL; END
IF @companyname = '' BEGIN SET @companyname = NULL; END
IF @housenumber = '' BEGIN SET @housenumber = NULL; END
IF @city = '' BEGIN SET @city = NULL; END
-- Insert statements for procedure here
BEGIN TRY
SELECT s.ID, COALESCE(d.FirstName,'NONE'), COALESCE(d.LastName,'NONE'), d.Street, COALESCE(d.CompanyName,'NONE'), d.HouseNumber, c.name
FROM Subscriber s
INNER JOIN SubscriberDetail d ON d.ID = s.Detail_ID
INNER JOIN City c ON d.City_ID = c.ID
WHERE (s.ID = COALESCE(@ID, s.ID)
AND d.FirstName = COALESCE(@firstname, d.FirstName) OR d.FirstName = 'NONE'
AND d.LastName = COALESCE(@lastname, d.LastName) OR d.LastName = 'NONE'
AND d.Street = COALESCE(@street, d.Street)
AND d.CompanyName = COALESCE(@companyname, d.CompanyName) OR d.CompanyName = 'NONE'
AND d.HouseNumber = COALESCE(@housenumber, d.HouseNumber)
AND c.name = COALESCE(@city, c.name))
SET @ResultCount = @@ROWCOUNT
SET @ResultString = 'Lookup successful'
SET @ResultValue = 0
END TRY
BEGIN CATCH
SET @ResultString = 'ERROR: ' + ERROR_MESSAGE()
SET @ResultValue = 2
END CATCH
END
GO
Run Code Online (Sandbox Code Playgroud)
示例数据:
订户:
ID = 1 | Type_ID = 1 | Detail_ID = 2
ID = 2 | Type_ID = 2 | Detail_ID = 3
Run Code Online (Sandbox Code Playgroud)
SubscriberDetail:
ID = 1 | FirstName = 'Laurens' | LastName = 'De Neys' | CompanyName = NULL | Street = 'Ergens' | HouseNumber = 2 | City_ID = 1
ID = 2 | FirstName = 'Tim' | LastName = 'Blabla' | CompanyName = NULL | Street = 'Iets' | HouseNumber = 26 | City_ID = 2
Run Code Online (Sandbox Code Playgroud)
市:
ID = 1 | name = 'Liedekerke' | postalCode = 1770
ID = 1 | name = 'Leuven' | postalCode = 3000
Run Code Online (Sandbox Code Playgroud)
也许您需要将OR条件放在括号中并保留原始条件?
对于所有这些表达式:
AND d.LastName = COALESCE(@lastname, d.LastName) OR d.LastName = 'NONE'
Run Code Online (Sandbox Code Playgroud)
改成
AND (d.LastName = COALESCE(@lastname, d.LastName) OR d.LastName = 'NONE')
Run Code Online (Sandbox Code Playgroud)
编辑
好吧,我不知道你的数据库中有什么,但我感觉有些逻辑不正确.试试这个:
SELECT s.ID, COALESCE(d.FirstName,'NONE'), COALESCE(d.LastName,'NONE'), d.Street, COALESCE(d.CompanyName,'NONE'), d.HouseNumber, c.name
FROM Subscriber s
INNER JOIN SubscriberDetail d ON d.ID = s.Detail_ID
INNER JOIN City c ON d.City_ID = c.ID
WHERE (@id is null or s.ID = @ID)
AND (@firstname is null or d.FirstName = @firstname)
AND (@lastname is null or d.LastName = @lastname)
AND (@street is null or d.Street = @street)
AND (@companyname is null or d.CompanyName = @companyname)
AND (@housenumber is null or d.HouseNumber = @housenumber)
AND (@city is null or c.name = @city)
Run Code Online (Sandbox Code Playgroud)