Sql 存储过程检查参数是否为NULL

Sql 存储过程检查参数是否为NULL,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我不熟悉存储过程,所以这里我真的需要一些帮助。我试图修改一个sp,以便在参数为null时显示所有记录,如果参数不为null,则会运行另一个查询。我得到的是函数expects参数@marketid的错误过程,该参数未提供。有人能帮我解决这个问题吗 ALTER procedure [dbo].[sp_GetProductDetailsForMarket] @marketid int as IF @marketid IS NOT NULL begin SELECT p.ProductID, p

我不熟悉存储过程,所以这里我真的需要一些帮助。我试图修改一个sp,以便在参数为null时显示所有记录,如果参数不为null,则会运行另一个查询。我得到的是函数expects参数@marketid的错误
过程,该参数未提供
。有人能帮我解决这个问题吗

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

您的问题不在存储过程中。您的问题是调用应用程序没有传入参数。如果需要,可以将其默认为null,如下所示:

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

或者,您可以始终传入它,不管是否为null。

将默认值添加到输入参数,即null

ALTER  procedure [dbo].[sp_GetProductDetailsForMarket]
@marketid int = NULL
因此,当您像这样调用存储过程时:

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

它不会显示错误,因为您的输入参数@marketid的默认值现在未设置为NULL

!它显示所有3364行,就像我需要的一样!希望它也能在应用程序中工作。:)@jlg:-它肯定也会在您的应用程序中起作用。您的存储过程正常!谢谢这让我对自己正在做的事情不那么紧张@jlg:-我相信这对你会有用。别紧张。享受你的代码吧。我的代码不起作用。我认为这是因为marketid是一个int,而int永远不会是
NULL
。我不得不将行
@marketid int=NULL
更改为
@marketid int=0
非常感谢@Bill!我还不能接受答案,因为我的问题太新了,所以我现在只给你们两个一分。:)我可以接受两个答案吗?@jlg:-不,你不能接受两个答案。你可以接受帮助你的人。快乐编码!:)两个答案都有帮助。我想这只能归结为谁先回答。如果我选择两者作为答案,我会的!非常感谢你的帮助!如果是我的话,我会把它给一个有40万美誉的人。他会比那个有着26400个名声的家伙更感激的这是一个非常好的观点。我自己也在考虑……但别担心,这个网站很古老,我对它了解不多。我相信我很快会有更多的问题。旁注:您不应该在存储过程中使用
sp_
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!好的,我以后会记得的。这个数据库是在2008年开发的,比我的时代早。我只是在修改它。:)