Om man har en procedur som ska kunna ta emot tex en eller flera id:n och returnera resultatet. Hur skulle ni lösa det? Jag har använt mig av PathIndex för att få till det men jag undrar om det finns något bättre sätt att göra detta på. Så här har det ungefär sett ut:
--In värden till sp:n
@Ids = '1,2,3,4,5'
SELECT Id
FROM tbl_X
WHERE (PATINDEX('%,' + cast(Id as varchar) + ',%', ',' + @Ids + ',') <> 0)
Finns det något smartare sätt att göra detta på eller är det så ni gör?
emissionMedlem sedan dec. 19996 721 inlägg Det räcker bra med en CHARINDEX. Ett annat alternativ, som kan vara intressant i vissa lägen (t.ex. om placeringen i kommalistan är relevant) är att man använder en UDF som splittar strängen till en tabell och joinar med denna.
Detta (som vi även diskuterar i en annan tråd ) är ett typfall på när en SP förstör mer än den tillför.
Jag tillhör dem som också använder sp:s till allt och tycker det funkar tiptop även i detta fall.
Jag gör som emission ger exempel på, använder en uf och joinar.
Rent å snyggt blir det tycker jag! :)
UF
CREATE FUNCTION [dbo].[ufIntSplit] (@list ntext)
RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL,
number int NOT NULL)
AS
BEGIN
DECLARE @pos int,
@textpos int,
@chunklen smallint,
@str nvarchar(4000),
@tmpstr nvarchar(4000),
@leftover nvarchar(4000)
SET @textpos = 1
SET @leftover = ''
WHILE @textpos <= datalength(@list) / 2
BEGIN
SET @chunklen = 4000 - datalength(@leftover) / 2
SET @tmpstr = ltrim(@leftover + substring(@list, @textpos, @chunklen))
SET @textpos = @textpos + @chunklen
SET @pos = charindex(',', @tmpstr)
WHILE @pos > 0
BEGIN
SET @str = substring(@tmpstr, 1, @pos - 1)
INSERT @tbl (number) VALUES(convert(int, @str))
SET @tmpstr = ltrim(substring(@tmpstr, @pos + 1, len(@tmpstr)))
SET @pos = charindex(',', @tmpstr)
END
SET @leftover = @tmpstr
END
IF ltrim(rtrim(@leftover)) <> ''
INSERT @tbl (number) VALUES(convert(int, @leftover))
RETURN
END
exempel
CREATE PROCEDURE test
@str text
AS
BEGIN
SELECT *
FROM tabell t
INNER JOIN ufIntSplit(@str) tmp ON t.Id = tmp.number
END