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)
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)
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
trùng lặp: http://stackoverflow.com/questions/144550/sql-server- dynamic-where-clause – JoshBerke
Duplicate: http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause – JoshBerke
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) –