SQL Server - 卡住了存储过程

时间:2014-04-13 09:16:21

标签: sql sql-server stored-procedures sql-server-2012

我有这个存储过程:

CREATE procedure Sp_GetAllInventoryPivot     
   (@UserID int,          
    @clientID int,          
    @projectID int,          
    @productID int          
)            
as begin            
   declare @pivot varchar(max);            
   declare @sql varchar(max);            

   DECLARE @AttributeNameList nvarchar(max);            
   SET @AttributeNameList = N'';            

   if exists(select AttributeName FROM Attribute where ShowButton=1 and ProductID= @productID)            
   begin            
      SELECT @AttributeNameList += '[' + AttributeName + ']' + N',' 
      FROM Attribute 
      WHERE ShowButton = 1 AND ProductID = @productID AND IsDeleted = 0;            

      SELECT @pivot = LEFT(@AttributeNameList,LEN(@AttributeNameList)-1);            
      print @Pivot            

      SELECT @sql = 'SELECT * FROM           
(SELECT            
 w.WorkFlowTransId as WorkFlowTransID,          
 w.ProjectId,          
 w.ProductID,          
 w.ClientId,    
 isnull((SELECT top 1 DiscrepancyStatusCode            
 FROM [Descrepancy]             
 where WorkFlowTransId=w.WorkFlowTransId order by DiscrepancyStatusCode asc ),'''') as DiscrepancyCode,          
  Attribute.AttributeName,          
   AttributeValue.AttributeValueName,  
   isnull((SELECT count(WorkFlowValueID)            
 FROM WorkFlowValue wfv            
 where wfv.WorkFlowTransId=w.WorkFlowTransId and wfv.WorkFlowValueName=''''),'''') as Status        
FROM Attribute             
JOIN AttributeValue ON Attribute.AttributeID = AttributeValue.AttributeID  
JOIN dbo.WorkFlowTransaction w on w.WorkFlowTransId=AttributeValue.WorkFlowTransId             
 where isnull(w.IsDeleted,0)=0 and isnull(Attribute.IsDeleted,0)=0) as s                   
pivot( MIN(AttributeValueName) for AttributeName in ('+')) as p           
where p.ProductId='+Convert(varchar,@productID)+'           
and p.ClientId='+Convert(varchar,@clientID)+'          
and p.ProjectId='+Convert(varchar,@projectID)+'          
'           
exec(@sql);             
end            
end 

我想在SQL Server本身中使用productID = 2等硬编码值执行此查询,我不想要声明。如果我只需要@sql,其中所有值必须在没有声明的情况下给出

我希望看到SQL Server本身的值。我需要怎么做?我对SQL Server很新。请通过提供解决方案来帮助我。

3 个答案:

答案 0 :(得分:0)

假设您的存储过程已成功创建,您可以这样调用它:

EXEC Sp_GetAllInventoryPivot @UserId = 1, @ClientId = 2, @projectID = 2, @productID = 2; 

EXEC关键字用于执行命令,在本例中是您的存储过程。然后,您可以指定参数及其值。参数名称是可选的,因此您也可以这样做:

EXEC Sp_GetAllInventoryPivot 1,2,2,2;

编辑:假设您的问题是关于使用所谓的默认'运行存储过程。即使没有指定任何参数,它也可以运行,你可以像这样初始化参数:

CREATE procedure Sp_GetAllInventoryPivot
@UserID int = 1,          
@clientID int = 2,          
@projectID int = 2,          
@productID int = 2

现在您只需调用该过程而无需指定参数值。

答案 1 :(得分:0)

在新的查询窗口中,通过将值传递给存储过程参数

来使用EXEC命令

例如

EXEC Sp_GetAllInventoryPivot 10,2,4,50

显示为以下参数提供值时的结果

@UserID =10          
@clientID=2         
@projectID=4          
@productID=50  

答案 2 :(得分:0)

您可以直接致电SP:

exec Sp_GetAllInventoryPivot 1, 1, 2, 1

或者,即使没有exec它也能正常工作:

Sp_GetAllInventoryPivot 1, 1, 2, 1

或者,出于测试目的,您可以注释掉创建过程部分并自己声明变量:

--CREATE procedure Sp_GetAllInventoryPivot     
--(          
--@UserID int,          
--@clientID int,          
--@projectID int,          
--@productID int          
--)            
--as begin     
DECLARE @UserID int
DECLARE @clientId int
DECLARE @projectID int
DECLARE @productID int

SET @UserID = 1
SET @clientId = 1
SET @projectID = 2
SET @productId = 1

如果这样做,请不要忘记在最后注释END,当切换回SP创建时,取消注释原始行并注释这八行。