Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server SP - Предаване на параметър за IN масив списък?

През 2005 г. и по-рано не можете да предадете масив като параметър към съхранена процедура, но за да емулирате тази функционалност, преминете в разделен със запетая списък с идентификатори като параметър VARCHAR. След това ще трябва да анализирате този списък, като добавите всеки идентификатор към таблица с променливи. След това използвайте IN върху резултата от таблицата. Това не е елегантно решение, но е най-доброто, което можете да направите.

DECLARE @List TABLE (ID INT)

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

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

Това се постига най-добре чрез създаване на функция, която приема списък с идентификатори като низ и връща вашия списък с идентификатори като таблица.

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

Ето пример за създаване на съхранена процедура, която приема списък с идентификатори, използвайки тази функция

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. Използвайте APP_NAME(), за да получите името на приложението на текущата сесия в SQL Server

  2. Как да проверите дали съществува съхранена процедура, преди да я създадете

  3. получавате разделен със запетая низ от редове

  4. Какво представляват покриващите индекси и покрити заявки в SQL Server?

  5. Как да настроите съпоставянето на колона в SQL Server (T-SQL)