![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
I'm new to SQL Server, so if I'm doing anything stupid don't be mean ![]() I have a procedure that I use to return data based on optional parameters. It works fine, except when the underlying data contains a null on one if the fields being searched. My system uses a default wildcard for all parameters, so this excludes such records. I need a way to add in " OR fldName IS NULL " where the parameter is empty or '%'. I've looked at using CASE WHEN, but it doesnt seem to like SQL Keywords being part of the WHEN clause. I'd hate to have to resort to executing concatonated strings made from IF and ELSE statements. Just too messy and not at all pretty! Any Ideas? Here's what I've got: ALTER PROCEDURE [dbo].[procFindUnits] @strUnitID nvarchar = '%', @strProjectName nvarchar = '%', @strAddress nvarchar = '%', @strTenancy nvarchar = '%', @strTenure nvarchar = '%' AS BEGIN SET NOCOUNT ON; SELECT tblUnits.strUnitID, tblProjects.strProjectName, qryAddresses.Address_OneLine, lkpTenancyTypes.strTenancyType, lkpTenureTypes.strTenureType FROM tblUnits INNER JOIN tblProjects ON tblUnits.intProjectID = tblProjects.intProjectID LEFT OUTER JOIN lkpTenancyTypes ON tblUnits.intTenancyType = lkpTenancyTypes.intTenancyType LEFT OUTER JOIN lkpTenureTypes ON tblUnits.intTenureType = lkpTenureTypes.intTenureTypeID LEFT OUTER JOIN qryAddresses ON tblUnits.strUnitID = qryAddresses.strUnitID WHERE (tblUnits.strUnitID LIKE @strUnitID) AND (tblProjects.strProjectName LIKE @strProjectName) AND (qryAddresses.Address_OneLine LIKE @strAddress) AND (lkpTenancyTypes.strTenancyType LIKE @strTenancy) AND (lkpTenureTypes.strTenureType LIKE @strTenure) END |
#3
| ||||
| ||||
|
|
I'm new to SQL Server, so if I'm doing anything stupid don't be mean ![]() |
|
I have a procedure that I use to return data based on optional parameters. It works fine, except when the underlying data contains a null on one if the fields being searched. |
|
My system uses a default wildcard for all parameters, so this excludes such records. I need a way to add in " OR fldName IS NULL " where the parameter is empty or '%'. I've looked at using CASE WHEN, but it doesnt seem to like SQL Keywords being part of the WHEN clause. |
|
I'd hate to have to resort to executing concatonated strings made from IF and ELSE statements. Just too messy and not at all pretty! Any Ideas? Here's what I've got: ALTER PROCEDURE [dbo].[procFindUnits] @strUnitID nvarchar = '%', @strProjectName nvarchar = '%', @strAddress nvarchar = '%', @strTenancy nvarchar = '%', @strTenure nvarchar = '%' AS BEGIN SET NOCOUNT ON; SELECT tblUnits.strUnitID, tblProjects.strProjectName, qryAddresses.Address_OneLine, lkpTenancyTypes.strTenancyType, lkpTenureTypes.strTenureType FROM tblUnits INNER JOIN tblProjects ON tblUnits.intProjectID = tblProjects.intProjectID LEFT OUTER JOIN lkpTenancyTypes ON tblUnits.intTenancyType = lkpTenancyTypes.intTenancyType LEFT OUTER JOIN lkpTenureTypes ON tblUnits.intTenureType = lkpTenureTypes.intTenureTypeID LEFT OUTER JOIN qryAddresses ON tblUnits.strUnitID = qryAddresses.strUnitID WHERE (tblUnits.strUnitID LIKE @strUnitID) AND (tblProjects.strProjectName LIKE @strProjectName) AND (qryAddresses.Address_OneLine LIKE @strAddress) AND (lkpTenancyTypes.strTenancyType LIKE @strTenancy) AND (lkpTenureTypes.strTenureType LIKE @strTenure) END |
#4
| |||
| |||
|
|
I have a procedure that I use to return data based on optional parameters. It works fine, except when the underlying data contains a null on one if the fields being searched. My system uses a default wildcard for all parameters, so this excludes such records. I need a way to add in " OR fldName IS NULL " where the parameter is empty or '%'. I've looked at using CASE WHEN, but it doesnt seem to like SQL Keywords being part of the WHEN clause. |
#5
| |||
| |||
|
#6
| |||
| |||
|
|
WHERE base_column LIKE (@parameter, '%') The guy also needs to read anything on ISO-11179 naming conventions so he does nto use those silly prefixes, knows that there no such thing as "type_id", etc. But he did get plural and collective table names right. |
#7
| ||||
| ||||
|
|
I'll pull a Celko and point out you mean columns here. But no matter. I don't know Celko, but I'll watch my language in future |
|
I don't think you need the WHEN in there, but that's the right basic approach. |
|
Your nvarchar need sizes, otherwise they're defaulting to one character in length. |
|
And do you really want to use LIKE in all of those? It'll really hurt performance in most cases. |

#8
| |||
| |||
|
|
I'll pull a Celko and point out you mean columns here. But no matter. |

|
Your nvarchar need sizes, otherwise they're defaulting to one character in length. |
|
And do you really want to use LIKE in all of those? It'll really hurt performance in most cases. |

#9
| |||
| |||
|
|
Anyway, I figured it out in the end - here's the final result. Please feel free to tear it apart critically - I'm here to learn ![]() ... WHERE (@strUnitID IS NULL OR tblUnits.strUnitID LIKE @strUnitID) AND (@strProjectName IS NULL OR tblProjects.strProjectName LIKE @strProjectName) ... |
#10
| |||||
| |||||
|
| I'll pull a Celko and point out you mean columns here. But no matter. I don't know Celko, but I'll watch my language in future ![]() |
|
I don't think you need the WHEN in there, but that's the right basic approach. I'm a little confused by this comment, how to you specify parameters to a query withoug having either WHEN or HAVING? |
| Your nvarchar need sizes, otherwise they're defaulting to one character in length. Yeah, that one took a few minuets of head scratching to debug! |
| And do you really want to use LIKE in all of those? It'll really hurt performance in most cases. Really? I'm used to dealing with the MS Jet engine, tips on optimistaion always appreciated. I was under the (misguided?) impression that non-numeric searches required a LIKE clause |
|
Anyway, I figured it out in the end - here's the final result. Please feel free to tear it apart critically - I'm here to learn ![]() ALTER PROCEDURE [dbo].[procFindOccupants] @strOccupant nvarchar(50) = NULL, @strUnitID nvarchar(50) = NULL, @strProjectName nvarchar(50) = NULL, @strAddress nvarchar(50) = NULL, @strTenancy nvarchar(50) = NULL, @strTenure nvarchar(50) = NULL AS BEGIN SET NOCOUNT ON; SELECT qryFullNames.FullName AS [Name], tblUnits.strUnitID AS [Unit ID], tblProjects.strProjectName AS [Project], qryAddresses.Address_OneLine AS [Address], lkpTenancyTypes.strTenancyType AS [Tenancy], lkpTenureTypes.strTenureType AS [Tenure] FROM tblUnits INNER JOIN tblProjects ON tblUnits.intProjectID = tblProjects.intProjectID INNER JOIN tblOccupancies ON tblUnits.strUnitID = tblOccupancies.strUnitID INNER JOIN tblOccupants ON tblOccupancies.intOccupantID = tblOccupants.intOccupantID INNER JOIN qryFullNames ON tblOccupants.intOccupantID = qryFullNames.intOccupantID LEFT OUTER JOIN lkpTenancyTypes ON tblUnits.intTenancyType = lkpTenancyTypes.intTenancyType LEFT OUTER JOIN lkpTenureTypes ON tblUnits.intTenureType = lkpTenureTypes.intTenureTypeID LEFT OUTER JOIN qryAddresses ON tblUnits.strUnitID = qryAddresses.strUnitID WHERE (@strUnitID IS NULL OR tblUnits.strUnitID LIKE @strUnitID) AND (@strProjectName IS NULL OR tblProjects.strProjectName LIKE @strProjectName) AND (@strAddress IS NULL OR qryAddresses.Address_OneLine LIKE '%' + @strAddress + '%') AND (@strTenancy IS NULL OR lkpTenancyTypes.strTenancyType LIKE @strTenancy) AND (@strTenure IS NULL OR lkpTenureTypes.strTenureType LIKE @strTenure) AND (@strOccupant IS NULL OR qryFullNames.FullName LIKE @strOccupant) END |
![]() |
| Thread Tools | |
| Display Modes | |
| |