Results 1 to 6 of 6

Thread: [RESOLVED] SQL Array Parameter

  1. #1

    Thread Starter
    Frenzied Member cory_jackson's Avatar
    Join Date
    Dec 2011
    Location
    Fallbrook, California
    Posts
    1,114

    Resolved [RESOLVED] SQL Array Parameter

    I want to run a query that has a "Where in" clause with a variable array or list of integer. I could create the string, but I've been told before this is a bad practice and it should be done with a parameter and I do so with all my non-array variables. How do a create an array parameter and populate it? I envision something where the query clause would look like "Where in (@IDs).

  2. #2

    Thread Starter
    Frenzied Member cory_jackson's Avatar
    Join Date
    Dec 2011
    Location
    Fallbrook, California
    Posts
    1,114

    Re: SQL Array Parameter

    I forgot to say that. I know how to do the method of splitting the string into a table variable in SQL.

  3. #3
    PowerPoster techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,665

    Re: SQL Array Parameter

    Unless things have changed while I wasn't looking hte last few years, there isn't a way directly, and thast the way to do it is by passing in CSV string, and parsing it into a temp table or table var some ... and as soon as I typed that, it triggered something.... so I asked ChatGPT - https://chatgpt.com/share/75629807-6...4-1f4546558153

    -tg
    * I don't respond to private (PM) requests for help. It's not conducive to the general learning of others.*
    * I also don't respond to friend requests. Save a few bits and don't bother. I'll just end up rejecting anyways.*
    * How to get EFFECTIVE help: The Hitchhiker's Guide to Getting Help at VBF - Removing eels from your hovercraft *
    * How to Use Parameters * Create Disconnected ADO Recordset Clones * Set your VB6 ActiveX Compatibility * Get rid of those pesky VB Line Numbers * I swear I saved my data, where'd it run off to??? *

  4. #4

    Thread Starter
    Frenzied Member cory_jackson's Avatar
    Join Date
    Dec 2011
    Location
    Fallbrook, California
    Posts
    1,114

    Re: SQL Array Parameter

    Thanks TG. That's exactly what I did.
    Have a great weekend.

  5. #5
    PowerPoster Zvoni's Avatar
    Join Date
    Sep 2012
    Location
    To the moon and then left
    Posts
    4,702

    Re: [RESOLVED] SQL Array Parameter

    Being prevented to look at tg's ChatGPT-Answer, there is a way to achieve what cory wants but with Parameters:
    Using a staging-table!

    You need a "staging"-table in your Database. In your usecase it only needs one Column: StageID as Integer
    (Optional Attributes being UNIQUE, as well as having an unique index on that Column. Note: NO PRIMARY KEY!)

    Algorithm
    1) Empty out the staging table "DELETE FROM StageTable"
    2) In a loop using Parameters you insert the ID's you'd use in your WHERE IN-Clause
    Aircode (No idea what language you use, but i think you get the gist)
    Code:
    For i=0 To CountParams-1
       SQLcmd.Text="INSERT INTO StageTable (StageID) VALUES (:pID);"
       'Set Parameter-Value
       SQLcmd.Execute
    Next
    3) Now you can do your SELECT-Query with a simple INNER JOIN
    Code:
    SELECT MRT.ID, MRT.SomeField1, MRT.SomeField2......... 
    FROM MyRealTable AS MRT
    INNER JOIN StageTable AS ST ON MRT.ID=ST.StageID
    ORDER BY SomeThing
    4) (Optional) empty out the stage table again (see step1)

    No danger for injection

    As i said: No idea if that was the ChatGPT-Answer
    Last edited by Zvoni; Tomorrow at 31:69 PM.
    ----------------------------------------------------------------------------------------

    One System to rule them all, One Code to find them,
    One IDE to bring them all, and to the Framework bind them,
    in the Land of Redmond, where the Windows lie
    ---------------------------------------------------------------------------------
    People call me crazy because i'm jumping out of perfectly fine airplanes.
    ---------------------------------------------------------------------------------
    Code is like a joke: If you have to explain it, it's bad

  6. #6
    PowerPoster techgnome's Avatar
    Join Date
    May 2002
    Posts
    34,665

    Re: [RESOLVED] SQL Array Parameter

    The prompt:

    Using SQL Server, is there a way to pass in a list of values to a stored procedure so that it can be used as part of an IN clause of a query
    The response:
    Yes, you can pass a list of values to a stored procedure in SQL Server and use it as part of an IN clause. There are several approaches to achieve this, and I'll describe a couple of common methods:

    1. Passing a Delimited String and Splitting It in SQL Server
    You can pass a single string with delimited values (like a comma-separated list) and then split that string into a table or use it directly in the IN clause.

    Example:
    sql
    Copy code
    Code:
    CREATE PROCEDURE dbo.GetRecordsByValues
        @ValueList NVARCHAR(MAX)
    AS
    BEGIN
        SELECT *
        FROM YourTable
        WHERE YourColumn IN (SELECT value FROM STRING_SPLIT(@ValueList, ','));
    END
    Usage:
    sql
    Copy code
    Code:
    EXEC dbo.GetRecordsByValues @ValueList = '1,2,3,4,5';
    2. Using a Table-Valued Parameter (TVP)
    Table-Valued Parameters allow you to pass a set of rows (like a list of values) to a stored procedure.

    Step 1: Create a Table Type
    sql
    Copy code
    Code:
    CREATE TYPE dbo.ValueListType AS TABLE
    (
        Value INT
    );
    Step 2: Create the Stored Procedure
    sql
    Copy code
    Code:
    CREATE PROCEDURE dbo.GetRecordsByValues
        @Values dbo.ValueListType READONLY
    AS
    BEGIN
        SELECT *
        FROM YourTable
        WHERE YourColumn IN (SELECT Value FROM @Values);
    END
    Usage:
    sql
    Copy code
    Code:
    DECLARE @MyValues dbo.ValueListType;
    INSERT INTO @MyValues (Value) VALUES (1), (2), (3), (4), (5);
    
    EXEC dbo.GetRecordsByValues @Values = @MyValues;
    3. Using XML or JSON Input
    You can also pass XML or JSON data to the stored procedure, parse it inside, and use it in the IN clause.

    XML Example:
    sql
    Copy code
    Code:
    CREATE PROCEDURE dbo.GetRecordsByValues
        @XmlValues XML
    AS
    BEGIN
        SELECT *
        FROM YourTable
        WHERE YourColumn IN (
            SELECT Tbl.Col.value('.', 'INT') AS Value
            FROM @XmlValues.nodes('/Values/Value') Tbl(Col)
        );
    END
    Usage:
    sql
    Copy code
    Code:
    EXEC dbo.GetRecordsByValues @XmlValues = '<Values><Value>1</Value><Value>2</Value><Value>3</Value></Values>';
    Each method has its use cases, so you can choose the one that best fits your needs.
    * I don't respond to private (PM) requests for help. It's not conducive to the general learning of others.*
    * I also don't respond to friend requests. Save a few bits and don't bother. I'll just end up rejecting anyways.*
    * How to get EFFECTIVE help: The Hitchhiker's Guide to Getting Help at VBF - Removing eels from your hovercraft *
    * How to Use Parameters * Create Disconnected ADO Recordset Clones * Set your VB6 ActiveX Compatibility * Get rid of those pesky VB Line Numbers * I swear I saved my data, where'd it run off to??? *

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width