2013-12-04 4 views
3

Я новичок в хранимых процедурах, поэтому мне действительно нужна помощь здесь. Я пытаюсь изменить sp, чтобы показать все записи, если параметр имеет значение null, а если он не является нулевым, есть еще один запрос для его запуска. У меня есть ошибка Procedure of function expects parameter @marketid which was not supplied. Может кто-то, пожалуйста, помогите мне решить эту проблему?Сохраненная процедура Проверьте, является ли параметр NULL

ALTER procedure [dbo].[sp_GetProductDetailsForMarket] 
@marketid int 

as 

IF @marketid IS NOT NULL 
begin 
SELECT 
p.ProductID, p.pagenumber,p.ProductName,p.Description,p.CategoryID, 
    p.ItemNumber,p.Price,p.AlertFrequency,p.PrimaryImageName, 
    p.DeletionStateCode,p.Published,p.SearchTerms,p.ThumbNailPath, 
    p.UOMName,p.HCPCCode, 
    m.marketname,mm.MarketID, 
    pa.AttributeID,pa.AttributeValueID,pa.Price as AttributePrice, 
    pa.ImagePath,pa.ProductAttributeAssociationID,pa.IsOptional, 
    av.[Name] as AttributeValueName,a.[Name] as AttributeName 

FROM vPanel_Product p 
INNER JOIN vPanel_MarketMappings mm 
     on p.productid=mm.productid 
LEFT JOIN vPanel_Market m 
     on m.marketid=mm.marketid 
LEFT JOIN vPanel_ProductAttributeAssociation pa 
     on p.productid = pa.productid 
     and pa.deletionstatecode=0 
LEFT JOIN vPanel_Attributes a 
     on a.AttributeID = pa.AttributeID 
     and a.deletionstatecode=0 
LEFT JOIN vPanel_AttributeValues av 
     on av.attributeValueID = pa.attributeValueID 
     and av.deletionstatecode=0 
WHERE m.marketid = @marketid 
order by p.productname,A.ATTRIBUTEID,AV.ATTRIBUTEVALUEID 
end 

ELSE 

begin 
SELECT 
p.ProductID, p.pagenumber,p.ProductName,p.Description,p.CategoryID, 
    p.ItemNumber,p.Price,p.AlertFrequency,p.PrimaryImageName, 
    p.DeletionStateCode,p.Published,p.SearchTerms,p.ThumbNailPath, 
    p.UOMName,p.HCPCCode, 
    pa.AttributeID,pa.AttributeValueID,pa.Price as AttributePrice, 
    pa.ImagePath,pa.ProductAttributeAssociationID,pa.IsOptional, 
    av.[Name] as AttributeValueName,a.[Name] as AttributeName 

FROM vPanel_Product p 
LEFT JOIN vPanel_ProductAttributeAssociation pa 
     on p.productid = pa.productid 
     and pa.deletionstatecode=0 
LEFT JOIN vPanel_Attributes a 
     on a.AttributeID = pa.AttributeID 
     and a.deletionstatecode=0 
LEFT JOIN vPanel_AttributeValues av 
     on av.attributeValueID = pa.attributeValueID 
     and av.deletionstatecode=0 
WHERE @marketid IS NULL 
ORDER BY p.productname,A.ATTRIBUTEID,AV.ATTRIBUTEVALUEID 
end 
+2

Боковое примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+0

Хорошо, я запомню это в будущем. Эта база данных была разработана еще в 2008 году, до моего времени. Я просто его модифицировал. :) – jlg

ответ

3

Добавить значение по умолчанию для вашего входа paramtere т.е. NULL

ALTER procedure [dbo].[sp_GetProductDetailsForMarket] 
@marketid int = NULL 

Так что, когда вы будете называть хранимую процедуру так:

exec sp_GetProductDetailsForMarket 

не будет отображаться сообщение об ошибке, как не значение по умолчанию для вашего входного параметра @marketid теперь установлено на NULL

+1

потрясающий! Он показывает все 3364 строки, как мне нужно! Надеюсь, он тоже работает в приложении. :) – jlg

+0

@jlg: - Он наверняка будет работать и в вашем приложении. Ваша хранимая процедура в порядке! –

+1

Спасибо! Это заставляет меня нервничать из-за того, что я делаю. :) – jlg

3

Ваша проблема не в вашей хранимой процедуре. Ваша проблема заключается в том, что ваше приложение Вызывающий не передавая параметр в Вы можете настроить его на нуль, если вы хотите, как это:.

ALTER procedure [dbo].[sp_GetProductDetailsForMarket] 
@marketid int = NULL 

Или вы могли бы просто всегда передать его, нуль или нет.

+0

Большое спасибо @Bill! Я не могу принять ответ еще, потому что мой вопрос слишком велик, так что я просто дал вам и то, и другое. :) Могу ли я принять как ответ? – jlg

+0

@jlg: - НЕТ, вы не можете принять 2 ответа. Вы можете принять тот, который вам помог. Счастливое кодирование! :) –

+0

Оба ответа помогли. Я думаю, это просто сводится к тому, кто первым ответил. Если я выберу оба в качестве ответа, я бы! Большое спасибо за помощь! – jlg

Смежные вопросы