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

Съхранена процедура с променлив брой параметри

Можете да го подадете като списък, разделен със запетаи, след това да използвате функция за разделяне и да обедините резултатите.

CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(INT, Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]', 'INT')
           FROM
           (
               SELECT [XML] = CONVERT(XML, '<i>' 
                    + REPLACE(@List, @Delimiter, '</i><i>') 
                    + '</i>').query('.')
           ) AS a
           CROSS APPLY
           [XML].nodes('i') AS x(i)
       ) AS y
       WHERE Item IS NOT NULL
   );

Сега вашата съхранена процедура:

CREATE PROCEDURE dbo.doStuff
    @List VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT cols FROM dbo.table AS t
        INNER JOIN dbo.SplitInts(@List, ',') AS list
        ON t.ID = list.Item;
END
GO

След това, за да го извикате:

EXEC dbo.doStuff @List = '1, 2, 3, ...';

Можете да видите някои предистория, други опции и сравнения на ефективността тук:

На SQL Server 2016 или по-нова версия обаче трябва да погледнете STRING_SPLIT() и STRING_AGG() :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите низ за връзка от база данни

  2. Трябва ли да използвам !=или <> за не е равно в T-SQL?

  3. Излагане на обекти на база данни на SQL Server като файлове във файлова система

  4. Как да премахна колона с обектни зависимости в SQL Server 2008?

  5. Как да направите маркиране на резултати от пълнотекстова заявка на SQL Server