разделить строковый параметр и выбрать на этом массиве строк? - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть хранимая процедура GetReportItems:

GetReportItems

@ItemId varchar(max)

SELECT rt.ReportName, rt.ReportId, rg.OriginatedFrom
FROM Reports rt
    JOIN ReportOrigin rg on rg.ReportId = rt.ReportId
        WHERE rt.ColA = SUBSTRING(@ItemId, 1, 3) 
        AND rt.ColB = SUBSTRING(@ItemId, 4, Len(@ItemId) - 3)

@ItemId Я могу передать это как: ABC123Z ИЛИ DEF3456Y ИЛИ GHI7890X, и все это прекрасно работает.

Но мне нужно обновить эту хранимую процедуру, чтобы разрешить:

  1. передать ABC123Z~DEF3456Y~GHI7890X как @ItemId, параметр хранимой процедуры.
  2. хранимая процедура для разделения строки @ItemId на ~ и вызова SELECT для каждой из этих строк.

Как я мог сделать 1 и 2 выше? Даже если я передам несколько параметров хранимому процессу, как я могу агрегировать SELECT по всем этим параметрам?

1 Ответ

1 голос
/ 30 декабря 2011

Временные столы - ваш друг здесь.:) Возьмите свой @ItemID и разбейте его на временную таблицу, затем присоедините свой отчет к этой временной таблице.

-- We need some variables for working with the data
DECLARE   @Sep Char,
          @SepPos Int
SET @Sep = '~'

-- We need a place to store our arguments
CREATE TABLE #Values (Val1 VarChar(3), Val2 VarChar(50))

SELECT @SepPos = CharIndex (@Sep, @ItemID)
WHILE @SepPos > 0 BEGIN
   -- Parse the leading argument into the temp table
   INSERT INTO #Values (Val1, Val2)
   SELECT   SubString (@ItemID, 1, 3),
            SubString (@ItemID, 4, @SepPos - 4)

   -- Remove the leading argument from the argument string
   SELECT @ItemID = SubString (@ItemID, @SepPos + 1, Len (@ItemID))
   -- Find the next separator
   SELECT @SepPos = CharIndex (@Sep, @ItemID)
END
-- On the last loop, it won't have a separator, so we'll end up with
-- one last argument to parse into our temp table
INSERT INTO #Values (Val1, Val2)
SELECT   SubString (@ItemID, 1, 3),
         SubString (@ItemID, 4, Len (@ItemID) - 3)

-- Now join to our report
SELECT   *
FROM     Reports rt
   JOIN ReportOrigin rg ON rg.ReportId = rt.ReportId
   JOIN #Values ON
        rt.ColA = #Values.Val1 AND rt.ColB = #Values.Val2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...