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

Procedura składowana ze zmienną liczbą parametrów

Możesz przekazać ją jako listę oddzieloną przecinkami, a następnie użyć funkcji dzielenia i połączyć z wynikami.

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
   );

Teraz Twoja procedura składowana:

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

Następnie nazwij to:

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

Tutaj możesz zobaczyć tło, inne opcje i porównania wydajności:

Jednak w przypadku SQL Server 2016 lub nowszego należy spojrzeć na STRING_SPLIT() i 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. FLOOR() Przykłady w SQL Server

  2. Czy istnieje sposób na uproszczenie porównania NULL 2 wartości?

  3. Jak usunąć końcowe spacje z zapytania SQL Server 2008 podczas eksportowania do csv?

  4. wydajność związku kontra związek wszystkich

  5. Plusy i minusy wdrożenia hybrydowego środowiska chmury