Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server SP — parametr przekazania dla listy tablicy IN?

W roku 2005 i wcześniejszych nie można przekazać tablicy jako parametru do procedury składowanej, ale aby emulować tę funkcjonalność, należy przekazać listę identyfikatorów oddzielonych przecinkami jako parametr VARCHAR. Następnie musisz przeanalizować tę listę, dodając każdy identyfikator do tabeli zmiennych. Następnie użyj IN na wyniku tabeli. To nie jest eleganckie rozwiązanie, ale to najlepsze, co możesz zrobić.

DECLARE @List TABLE (ID INT)

INSERT @List VALUES ('123')
INSERT @List VALUES ('12')

SELECT *
FROM
    MyTable
WHERE
    MyTableID IN (SELECT ID FROM @List)

Najlepiej to osiągnąć tworząc funkcję, która pobiera listę identyfikatorów jako ciąg i zwraca listę identyfikatorów w postaci tabeli.

IF EXISTS(
    SELECT *
    FROM sysobjects
    WHERE name = 'ParseIDArray')
BEGIN
    DROP FUNCTION ParseIDArray
END
GO

CREATE FUNCTION [dbo].[ParseIDArray] (@IDList VARCHAR(8000))
RETURNS
    @IDListTable TABLE (ID INT)
AS
BEGIN

    DECLARE
        [email protected] VARCHAR(100),
        @LastCommaPosition INT,
        @NextCommaPosition INT,
        @EndOfStringPosition INT,
        @StartOfStringPosition INT,
        @LengthOfString INT,
        @IDString VARCHAR(100),
        @IDValue INT

    --SET @IDList = '11,12,113'

    SET @LastCommaPosition = 0
    SET @NextCommaPosition = -1

    IF LTRIM(RTRIM(@IDList)) <> ''
    BEGIN

        WHILE(@NextCommaPosition <> 0)
        BEGIN

            SET @NextCommaPosition = CHARINDEX(',',@IDList,@LastCommaPosition + 1)

            IF @NextCommaPosition = 0
                SET @EndOfStringPosition = LEN(@IDList)
            ELSE
                SET @EndOfStringPosition = @NextCommaPosition - 1

            SET @StartOfStringPosition  = @LastCommaPosition + 1
            SET @LengthOfString = (@EndOfStringPosition + 1) - @StartOfStringPosition

            SET @IDString =  SUBSTRING(@IDList,@StartOfStringPosition,@LengthOfString)                  

            IF @IDString <> ''
                INSERT @IDListTable VALUES(@IDString)

            SET @LastCommaPosition = @NextCommaPosition

        END --WHILE(@NextCommaPosition <> 0)

    END --IF LTRIM(RTRIM(@IDList)) <> ''

    RETURN

ErrorBlock:

    RETURN

END --FUNCTION

Oto przykład tworzenia procedury składowanej, która pobiera listę identyfikatorów za pomocą tej funkcji

IF EXISTS (SELECT * FROM sysobjects WHERE name = 'TestArrayParameter')
BEGIN
    DROP PROCEDURE TestArrayParameter
END
GO



CREATE PROCEDURE TestArrayParameter
    @ArrayParameter VARCHAR(8000)
AS
BEGIN


    SELECT *
    FROM TestTable123
    WHERE TestTblID IN (SELECT ID FROM [dbo].[ParseIDArray](@ArrayParameter))

    -- OR BETTER

    SELECT *
    FROM
        TestTable123 test
        INNER JOIN [dbo].[ParseIDArray](@ArrayParameter) list
         ON list.ID = test.TestTblID

END
GO

CREATE TABLE TestTable123  (TestTblID INT, TestTblVal VARCHAR(50))

INSERT TestTable123 VALUES (3,'Three')
INSERT TestTable123 VALUES (25,'Twenty Five')
INSERT TestTable123 VALUES (100,'One Hundred')

DECLARE @IDList VARCHAR(8000)

SET @IDList = '25,100'

EXEC TestArrayParameter @IDList

DROP TABLE TestTable123



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Napraw komunikat o błędzie 4151 „Typ pierwszego argumentu do wartości NULLIF nie może być stałą NULL, ponieważ typ pierwszego argumentu musi być znany” w programie SQL Server

  2. Jak dodać plik dziennika do bazy danych programu SQL Server (T-SQL)

  3. Uzyskaj informacje o widoku za pomocą widoku schematu informacji WIDOKÓW w SQL Server

  4. Procedury składowane SQL OUTPUT nie działają z ExecuteReader

  5. Jak wybrać zagnieżdżony JSON w SQL Server za pomocą OPENJSON