2015-01-07 33 views
0

我有一個需求,我得到一個字符串,如'1500,4444,7777'。這些是產品的ID。 現在我需要分割這個輸入,我已經有了分割功能。已嘗試使用循環也。拆分輸入參數並在存儲過程中輸出一個表

拆分ID後,我需要檢索輸入參數中發送的所有ID的ProductName及其GUID。我應該從SP返回一個ProductName和GUID的LIST,以便在Web方法中使用它。

產品表包含產品GUID,產品名稱和產品ID。現在我必須根據ID檢索GUID和Name。

我可以拆分產品ID,獲取產品名稱,但現在我堅持如何將產品名稱及其GUID添加到列表併發送。

請找到我嘗試到現在的SP。

CREATE PROCEDURE GetProductNamesByProductNumber 
(@productNumberList nvarchar(max)) 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE @Err int 

    DECLARE @pos int 
    DECLARE @len int 
    DECLARE @value varchar(8000) 
    DECLARE @prodName varchar(8000) 
    DECLARE @prodNames varchar(8000) 


    SET @productNumberList = @productNumberList + ',' 
    SET @pos = 0 
    SET @len = 0 

    WHILE CHARINDEX(',', @productNumberList , @pos + 1) > 0 
    BEGIN 
    SET @len = CHARINDEX(',', @productNumberList , @pos + 1) - @pos 
    SET @value = SUBSTRING(@productNumberList , @pos, @len) 

    SELECT 
     @prodName = ProductName FROM Product 
    WHERE ProductNumber = @value 

    SET @pos = CHARINDEX(',', @productNumberList , @pos + @len) + 1 

    IF @prodNames <> '' 
     SET @prodNames += ',' + @prodName 
    ELSE 
     SET @prodNames= @prodName 

    END 

    DECLARE @output_table TABLE (
    ProductName nvarchar(max) 
) 
    INSERT @output_table 
    SELECT 
     * 
    FROM SplitString(@prodNames, ',') 

    SELECT * FROM @output_table 

    SET @Err = @@Error 
    RETURN @Err 
END 

GO 
+0

您應該使用分割函數並將其加入到產品表中。 –

回答

1

一旦拆分輸入參數,然後添加到臨時表說

create table #tempProductID(productid int) 

然後,讓你的產品表

SELECT Product.ProductID, Product.GUID, Product.Name 
FROM Product INNER JOIN #tempProductID 
ON Product.ProductID = #tempProductID.ProductID 
+0

非常感謝你......太快了! –

+0

這不適用於多個值。你不能將一個逗號分隔的列表粘貼到一個變量中,並在in條件下使用它。你需要分割輸入字符串(體面的方法),使用表值參數而不是標量值(最好的方法),或者使用動態sql(不推薦)。 –

+0

是的,我會更新,實際上OP使用第一個,所以我刪除或接近 – HaveNoDisplayName

0

使用分裂TBV功能類似於連接此

CREATE FUNCTION [dbo].[udf_SplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 

然後,您可以將以上函數與PRODUCT表一起加入,並返回列表/表格,如

CREATE PROCEDURE GetProductNamesByProductNumber 
(@productNumberList nvarchar(max)) 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE @Err int 


    SELECT 
     ProductName, ProductGuid, ProductNumber FROM Product 
     INNER JOIN (SELECT Value FROM dbo.Split(@productNumberList, ',')) a ON p.ProductNumber = a.Value 


    END 
+0

你應該閱讀這篇文章。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings使用循環來拆分字符串是非常低效的。 –