5 Stimmen

Dynamische SQL-Abfrage mit kommagetrennten Werten

[Aktualisierung: Verwendung von SQL Server 2005]

Hallo, was ich tun möchte, ist meine gespeicherte Prozedur mit einer Komma-getrennten Liste von Werten (ids) abfragen, um Zeilen von Daten abzurufen.

Das Problem, das ich erhalte, ist ein Konvertierungsfehler:

Conversion failed when converting the varchar value ' +
@PassedInIDs + ' to data type int.

Die Aussage in meinem where-Klausel und Fehler ist:

...
AND (database.ID IN (' + @PassedInIDs + '))

Hinweis: Datenbank.ID ist vom Typ int.

Ich habe den Artikel auf verfolgt:

http://www.sql-server-helper.com/functions/comma-delimited-to-table.aspx

wurde aber aufgrund des Fehlers nicht abgeschlossen.

In meinem Ausführungsskript habe ich:

...
@PassedInIDs= '1,5'

Mache ich hier etwas falsch? Ich danke Ihnen für Ihre Hilfe.

0voto

Dan Punkte 3577

Ich schlage vor, in SQL 2005 dafür XML zu verwenden. Das ist zwar etwas umständlicher, kann aber einfacher sein. Sie können das XML in einer Tabelle auswählen, die dann verbunden oder eingefügt werden kann usw.

Schauen Sie sich OPENXML() von Sql Server an, wenn Sie es nicht schon getan haben.

Sie könnten zum Beispiel etwas eingeben wie: '12...'

und dann verwenden:

exec sp_xml_preparedocument @doc OUTPUT, @xmlParam

SELECT element 
FROM OPENXML (@doc, 'Array/Value', 2) WITH (element varchar(max) 'text()')

Das sollte ein Anfang sein

0voto

Ahmed Mozaly Punkte 1344

Dies kann auf 6 Arten gelöst werden, wie im Artikel von Narayana erwähnt Übergabe einer Liste/eines Arrays an eine gespeicherte SQL Server-Prozedur

Und meine direkteste Umsetzung ist

deklarieren @Statement nvarchar (256)
einstellen. @statement = 'select * from Personen where Personen.id in ('+ @PassedInIDs +')'
Ausführung sp_executesql @Anweisung

-

0voto

DareDevil Punkte 5150

Das habe ich gefunden und getestet:

SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
CREATE  FUNCTION [dbo].[SplitStrings] ( @IDsList VARCHAR(MAX) )
RETURNS @IDsTable TABLE ( [ID] VARCHAR(MAX) )
AS 
BEGIN
    DECLARE @ID VARCHAR(MAX)
    DECLARE @Pos VARCHAR(MAX)

    SET @IDsList = LTRIM(RTRIM(@IDsList)) + ','
    SET @Pos = CHARINDEX(',', @IDsList, 1)

    IF REPLACE(@IDsList, ',', '') <> '' 
        BEGIN
            WHILE @Pos > 0 
                BEGIN
                    SET @ID = LTRIM(RTRIM(LEFT(@IDsList, @Pos - 1)))
                    IF @ID <> '' 
                        BEGIN
                            INSERT  INTO @IDsTable
                                    ( [ID] )
                            VALUES  ( CAST(@ID AS VARCHAR) )
                        END
                    SET @IDsList = RIGHT(@IDsList, LEN(@IDsList) - @Pos)
                    SET @Pos = CHARINDEX(',', @IDsList, 1)
                END
        END 
    RETURN
END

GO

So funktioniert Call:

SELECT * FROM dbo.SplitStrings('123,548,198,547,965')

0voto

Hong Van Vit Punkte 2662
Try this:

    DECLARE @Ids varchar(50);
    SET @Ids = '1,2,3,5,4,6,7,98,234';

    SELECT * 
    FROM sometable 
    WHERE ','+@Ids+',' LIKE '%,'+CONVERT(VARCHAR(50),tableid)+',%';

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X