如何从select语句调用存储过程

时间:2014-08-11 11:54:51

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

我有一个产品表和一个变量表作为休闲

Product Table:  

    productId product_Name Product_Price Product_Brand 
    ==================================================
    1         Product      200           Brand

Variant Table:

    variantID ProductId Variant_Name
    ================================
    1         1          Black
    2         1          Blue
    3         2          white

我必须在变量的结果中列出产品,但每个产品都有4-5变体,如果我制作视图,那么由于多种变体,它会提供大量重复数据。

我希望变量字符串为

Black,Blue,white

为此我将一个商店程序写为休闲

create PROCEDURE [dbo].[get_Variant_String]
(@product Id int, @Char char)
AS
BEGIN
CREATE TABLE #tmp                         
(  
   varient varchar(100)
)
inset into #tmp
select  Variant_Name form  Variant where productID=@ProductId

DECLARE @VarientString varchar(100)
set @VarientString=''
DECLARE @Temp_Varient varchar(100) 
DECLARE Cur_Variant CURSOR for select varient  from #tmp
OPEN Cur_Variant 
WHILE 1 =1
BEGIN
  FETCH NEXT FROM Cur_Variant
  INTO  @Temp_Varient
  IF @@FETCH_STATUS <> 0
  BREAK
    IF @VarientString=''
    BEGIN
      SET @VarientString=@Temp_Varient
    END
    ELSE 
    BEGIN
      SET @VarientString=@VarientString + @Char +@Temp_Varient
    END
  END
CLOSE Cur_Variant
DEALLOCATE Cur_Variant
SELECT @VarientString
END

根据需要提供输出

现在我有一个商店程序来选择产品以选择产品。我在其中编写了选择查询以从产品表中选择产品。在此查询中,我想在产品变体的select语句中调用上面的存储过程并减少no或iteration 我已将select查询编写为fallow:

select productId,product_Name,Product_Price,Product_Brand,(exec get_Variant_String product.productid,',' ) as variant
from product

但是它给出了错误

请告诉我如何获得输出(对于每个产品)

productId product_Name Product_Price Product_Brand Variant
==================================================================
1         Product      200           Brand        Black,Blue,white 

我也尝试编写函数,但我有select语句,所以它给了我错误。

我有一个选项

使用product table和variant列中的列创建临时表。在该表中首先从产品表中插入详细信息然后创建corsor并使用存储过程获取每个产品的变体并从此临时表中选择产品但我有数百个产品因此在迭代数百次时我必须避免这个.please建议我如何在select语句中调用上面的存储过程以其他最佳方式执行此操作。

1 个答案:

答案 0 :(得分:1)

这样做更容易,而不是编写存储过程:

select p.*,
       stuff((select ',' + variant_name
              from variant v
              where v.productid = p.productid
              for xml path ('')
             ), 1, 1, ''
            ) as variants
from product p;