2009-02-11 28 views
8

Có cách nào để chuyển mảng giá trị vào phần IN của SP như một tham số đơn cho SQL Server 2005 không?SQL Server SP - Truyền tham số cho danh sách mảng "IN"?

Ex: Select * from MyTable nơi ID IN (@MyValueArray)

+0

trùng lặp: http://stackoverflow.com/questions/144550/sql-server- dynamic-where-clause – JoshBerke

+0

Duplicate: http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause – JoshBerke

+1

có thể trùng lặp của [thủ tục lưu trữ T-SQL chấp nhận nhiều giá trị Id] (http: // stackoverflow.com/questions/43249/t-sql-stored-procedure-that-accepts-multiple-id-values) –

Trả lời

5

Năm 2005 và trước đó bạn không thể vượt qua một mảng như một tham số để một stored procedure nhưng để thi đua vượt qua chức năng này trong một danh sách dấu phẩy tách ra ID là tham số VARCHAR. Sau đó, bạn sẽ cần phải phân tích cú pháp danh sách này thêm từng id vào một bảng biến. Sau đó sử dụng IN trên kết quả của bảng. Đây không phải là một giải pháp thanh lịch nhưng nó là tốt nhất bạn có thể làm.

DECLARE @List TABLE (ID INT) 

INSERT @List VALUES ('123') 
INSERT @List VALUES ('12') 

SELECT * 
FROM 
    MyTable 
WHERE 
    MyTableID IN (SELECT ID FROM @List) 

Điều này được thực hiện tốt nhất bằng cách tạo hàm có danh sách id làm chuỗi và trả về danh sách ID của bạn dưới dạng bảng.

IF EXISTS(
    SELECT * 
    FROM sysobjects 
    WHERE name = 'ParseIDArray') 
BEGIN 
    DROP FUNCTION ParseIDArray 
END 
GO 

CREATE FUNCTION [dbo].[ParseIDArray] (@IDList VARCHAR(8000)) 
RETURNS 
    @IDListTable TABLE (ID INT) 
AS 
BEGIN 

    DECLARE 
     [email protected] VARCHAR(100), 
     @LastCommaPosition INT, 
     @NextCommaPosition INT, 
     @EndOfStringPosition INT, 
     @StartOfStringPosition INT, 
     @LengthOfString INT, 
     @IDString VARCHAR(100), 
     @IDValue INT 

    --SET @IDList = '11,12,113' 

    SET @LastCommaPosition = 0 
    SET @NextCommaPosition = -1 

    IF LTRIM(RTRIM(@IDList)) <> '' 
    BEGIN 

     WHILE(@NextCommaPosition <> 0) 
     BEGIN 

      SET @NextCommaPosition = CHARINDEX(',',@IDList,@LastCommaPosition + 1) 

      IF @NextCommaPosition = 0 
       SET @EndOfStringPosition = LEN(@IDList) 
      ELSE 
       SET @EndOfStringPosition = @NextCommaPosition - 1 

      SET @StartOfStringPosition = @LastCommaPosition + 1 
      SET @LengthOfString = (@EndOfStringPosition + 1) - @StartOfStringPosition 

      SET @IDString = SUBSTRING(@IDList,@StartOfStringPosition,@LengthOfString)     

      IF @IDString <> '' 
       INSERT @IDListTable VALUES(@IDString) 

      SET @LastCommaPosition = @NextCommaPosition 

     END --WHILE(@NextCommaPosition <> 0) 

    END --IF LTRIM(RTRIM(@IDList)) <> '' 

    RETURN 

ErrorBlock: 

    RETURN 

END --FUNCTION 

Dưới đây là một ví dụ của việc tạo ra một stored procedure mà mất trong một danh sách các ID sử dụng chức năng này

IF EXISTS (SELECT * FROM sysobjects WHERE name = 'TestArrayParameter') 
BEGIN 
    DROP PROCEDURE TestArrayParameter 
END 
GO 



CREATE PROCEDURE TestArrayParameter 
    @ArrayParameter VARCHAR(8000) 
AS 
BEGIN 


    SELECT * 
    FROM TestTable123 
    WHERE TestTblID IN (SELECT ID FROM [dbo].[ParseIDArray](@ArrayParameter)) 

    -- OR BETTER 

    SELECT * 
    FROM 
     TestTable123 test 
     INNER JOIN [dbo].[ParseIDArray](@ArrayParameter) list 
     ON list.ID = test.TestTblID 

END 
GO 

CREATE TABLE TestTable123 (TestTblID INT, TestTblVal VARCHAR(50)) 

INSERT TestTable123 VALUES (3,'Three') 
INSERT TestTable123 VALUES (25,'Twenty Five') 
INSERT TestTable123 VALUES (100,'One Hundred') 

DECLARE @IDList VARCHAR(8000) 

SET @IDList = '25,100' 

EXEC TestArrayParameter @IDList 

DROP TABLE TestTable123 
Các vấn đề liên quan