Eine kommaseparierte Liste von Integer an eine Stored Procedure uebergeben

Man kann an eine Stored Procedure im SQL - Server keine Parameter vom Typ Array übergeben. Für den IN Operator einer SQL WHERE Klausel benötigt man aber eine Auflistung von kommaseparierten Werten.
Wie das mit einem nvarchar / string Parameter funktioniert habe ich bereits in diesem Blog erklärt. Nun möchte ich aber auch noch Zeigen, wie man dieses mit dem Datentyp Integer / int hinbekommt.

Eine Liste von Parameter kann man nur als String an eine SP übergeben - also: '1,2,3'.

CREATE PROCEDURE [dbo].[GaliNeo_Store_ProductListByProductId]

@productIds nvarchar (1000)

AS

SELECT * FROM GaliNeo_Store_Product P WHERE (P.[ProductID] in (SELECT ID from fn_Split_varcharToint(@productIds)) )

GO

Der Trick hier ist eine userdefined function zu nutzen, die aus dem nvarchar Parameter eine "Tabelle" macht, die dann ohne Probleme mit dem IN Parameter verarbeitet werden kann.

Die userdefined function sieht so aus:

CREATE Function fn_Split_varcharToint (@IDs nvarchar(100) )

Returns @Tbl_IDs Table (ID Int) As

Begin

-- Append comma
Set @IDs = @IDs + ','

-- Indexes to keep the position of searching
Declare @Pos1 Int
Declare @pos2 Int

-- Start from first character
Set @Pos1=1
Set @Pos2=1

While @Pos1<Len(@IDs)
Begin
Set @Pos1 = CharIndex(',',@IDs,@Pos1)
Insert @Tbl_IDs Select Cast(Substring(@IDs,@Pos2,@Pos1-@Pos2) As Int)
-- Go to next non comma character
Set @Pos2=@Pos1+1
-- Search from the next charcater
Set @Pos1 = @Pos1+1
End
Return
End

 

 

Kommentare (1) -

coco
24.07.2007 08:01:18 #

Hallo,

ich möchte nur mal DANKE sagen. Du hast mir gerade den Tag gerettet.

Deine Funktion zum Umwandeln einer INT-Liste in eine Tabelle ließ sich ganz schnell für eine GUID-Liste anpassen, so dass man mit einem "Join" statt einem "Where in" nach einer Liste von GUIDs suchen kann:

DECLARE @Table_IDs Table (ID UniqueIdentifier)
DECLARE @StartPosition Int
DECLARE @GuidAsString NVARCHAR(36)

SET @StartPosition = 1
SET @IDs = @IDs + ','

While @StartPosition<Len(@IDs)
Begin
  SET @GuidAsString = Substring(@IDs, @StartPosition, 36)

  INSERT @Table_IDs SELECT Cast(@GuidAsString As UniqueIdentifier)

  -- Go to next non comma character
  SET @StartPosition = CharIndex(',', @IDs, @StartPosition) + 1
End

Kommentar schreiben