Условие SQL, где выполнение пункта с использованием параметров строки запроса — нужна ли функция?

У меня есть следующий sp, который использует условное предложение where - ish!

@MemberId  varchar(7), 
@LocationId varchar(8),
@UUF1 varchar(150),
@UUF2 varchar(50),
@UUF4 varchar(50),
@IDDesc varchar(255),
@OwnBrand nvarchar(50),
@WeightStatus varchar(50),
@MaterialLevel varchar(10),
@BaseMaterialName varchar(15),
@ExtendedMaterialName varchar(50),
@PackagingTypeCode varchar(20),
@Biodegradable nvarchar(50),
@Recyclability varchar(30),
@Feedback varchar(255)

AS

SELECT     MemberId, MemberName, LocationId, IDDesc, UnitId, UnitDescription, UnitUserField1, UnitUserField2, UnitUserField4, IsOwnBrand, OwnBrand, 
                      UnitUserField10, SaleDate, SaleQty, LevelNo, WeightStatus, RevisionSourceCode, RevisionDate, MaterialLevel, BaseMaterialID, BaseMaterialName, 
                      ExtendedMaterialId, ExtendedMaterialName, PackagingTypeCode, UnitWeight, WeightUnitCode, IsBiodegradable, Biodegradable, RecycledContent, 
                      Recyclability, Tonnage, ProductPercentage, Productpriority, Feedback, PriKey
INTO            #tblSPPartI
FROM         tblWeights
WHERE     ((MemberId = @MemberID) OR (@MemberId IS NULL)) 
AND ((LocationId = @LocationID) OR (@LocationID IS NULL))  
AND ((UnitUserField1 = @UUF1) OR (@UUF1 IS NULL)) 
AND ((UnitUserField2 = @UUF2) OR (@UUF2 IS NULL))  
AND ((UnitUserField4 = @UUF4) OR (@UUF4 IS NULL)) 
AND ((IDDesc= @IDDesc) OR (@IDDesc IS NULL))  
AND ((OwnBrand = @OwnBrand) OR (@OwnBrand IS NULL)) 
AND ((WeightStatus = @WeightStatus) OR (@WeightStatus IS NULL)) 
AND ((MaterialLevel = @MaterialLevel) OR (@MaterialLevel IS NULL)) 
AND ((BaseMaterialName = @BaseMaterialName) OR (@BaseMaterialName IS NULL)) 
AND ((ExtendedMaterialName = @ExtendedMaterialName) OR (@ExtendedMaterialName IS NULL)) 
AND ((PackagingTypeCode = @PackagingTypeCode) OR (@PackagingTypeCode IS NULL)) 
AND ((IsBiodegradable = @Biodegradable) OR (@Biodegradable IS NULL)) 
AND ((Recyclability = @Recyclability) OR (@Recyclability IS NULL)) 
AND ((Feedback = @Feedback) OR (@Feedback IS NULL))

Когда я тестирую это в Sql, он прекрасно работает.

Однако я использую это в контексте веб-приложения, где параметры задаются с помощью строки запроса.

Строка запроса никогда не будет отправлена ​​как null в этом контексте — если пользователь не выбрал параметр, строка запроса для параметра будет «Не указано».

Следовательно, когда параметры строки запроса передаются в приведенный выше SQL, возвращаемое значение параметра «Не указано», а не то, что мне нужно, то есть нулевое значение.

Как бы я манипулировал (а) либо приведенным выше кодом, чтобы учитывать «Не указано», либо (б) мне нужно было бы изменить разметку кода html/c#?

Извините, если это не имеет смысла.


person Ricardo Deano    schedule 06.09.2010    source источник
comment
также имейте в виду, что этот подход может привести к тому, что иногда используются неправильные планы запросов...   -  person Mitch Wheat    schedule 06.09.2010


Ответы (1)


Вы можете использовать COALESCE.

COALESCE(@Feedback, 'Not Specified')

Это вернет вам «Не указано», когда @feedback имеет значение NULL.

для вашего примера это будет -

....WHERE     ((MemberId = COALESCE(@MemberID, 'Not Specified'))  
AND ((LocationId = COALESCE(@LocationID, 'Not Specified'))   
AND ((UnitUserField1 = COALESCE(@UUF1, 'Not Specified')) .....
person Sachin Shanbhag    schedule 06.09.2010
comment
Привет, Сачин. На самом деле мне пришлось кое-что изменить, но я, безусловно, вижу в этом пользу и буду использовать это в будущем. Приносим извинения за то, что пока не дали вам лучшего ответа - на работе застрял. - person Ricardo Deano; 07.09.2010