2015-01-07 2 views
0

'1500,4444,7777'과 같은 문자열이 필요한 요구 사항이 있습니다. 이것들은 제품의 ID입니다. 이제이 입력을 분할해야합니다. 이미 분할 기능이 있습니다. 루핑을 사용해 보았습니다.분할 입력 매개 변수 및 저장 프로 시저에서 테이블 출력

ID를 분할 한 후 입력 매개 변수에서 보낸 모든 ID에 대해 ProductName과 GUID를 검색해야합니다. 그리고 ProductName의 목록과 SP의 GUID를 웹 메서드에서 사용하기 위해 반환해야합니다.

제품 테이블에는 제품 GUID, 제품 이름 및 제품 ID가 들어 있습니다. 이제 ID를 기반으로 GUID 및 이름을 검색해야합니다.

제품 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) 

는이 분할 TBV 기능 등을 사용하여 제품 테이블

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

에 가입 할 말을 임시 테이블에 그 추가 이

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 

당신은 다음 제품 테이블 위의 기능을 결합하고 당신은 당신의 분할 기능을 사용하고 제품 테이블에 가입해야

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 루프를 사용하여 문자열을 분할하는 것은 대단히 비효율적입니다. –

관련 문제