próbujesz konwertować nie tylko string
do int
, ale kilkaint
ów w jeden. Czy spodziewasz się, że Twój SELECT
zwróci wszystkich pracowników i ID wymienionych w tablicy?
Zdaję sobie sprawę, że chciałeś to zrobić, bez funkcji. Jednak tak właśnie teraz to robię i działa świetnie. Weź to, co chcesz, z mojej odpowiedzi.
Ten kod używa pętli while
, która prawdopodobnie zostanie poprawiona na rekurencyjne CTE, jeśli używasz SQL 2005/2008. Możesz użyć wyjścia funkcji jako tabeli, którą możesz INNER JOIN
, co pozwoli ci bardzo szybko filtrować.
/*
************************************************************************************************************************
Name: ConvertDelimitedListIntoTable
Description: Converts a list of delimited values into a table for use like a dynamic IN statment
Modification History
Date Author Description
========== ============ ====================================
2009-01-31 B. Williams Initial Creation
************************************************************************************************************************
*/
ALTER FUNCTION [dbo].[ConvertDelimitedListIntoTable] (
@list NVARCHAR(MAX) ,@delimiter CHAR(1))
RETURNS @table TABLE (
item VARCHAR(255) NOT NULL)
AS
BEGIN
DECLARE @pos INT ,@nextpos INT ,@valuelen INT
SELECT @pos = 0 ,@nextpos = 1
WHILE @nextpos > 0
BEGIN
SELECT @nextpos = CHARINDEX(@delimiter,@list,@pos + 1)
SELECT @valuelen = CASE WHEN @nextpos > 0 THEN @nextpos
ELSE LEN(@list) + 1
END - @pos - 1
INSERT @table (item)
VALUES (CONVERT(INT,SUBSTRING(@list,@pos + 1,@valuelen)))
SELECT @pos = @nextpos
END
DELETE FROM @table
WHERE item = ''
RETURN
END
Zastosowanie:
DECLARE @intArray varchar(200)
SELECT *
FROM tbl_Employee e
INNER JOIN dbo.ConvertDelimitedListIntoTable(@intArray,',') arr
ON e.EmployeeID = arr.Item
Nie mogą być również szybki sposób zrobić to z tally
tabeli.
Jaką wersję programu SQL Server? Czy jesteś w stanie zmienić kod, który wywołuje twój sp? –
@Damien SQL Server 2005. Tak, jestem w stanie zmienić kod wywołujący moje sp. – Kukoy
szczurów. W 2008 r. Sugerowałbym zmianę na używanie parametrów wycenianych w tabeli. –