Выберите предмет из ряда предметов - PullRequest
0 голосов
/ 18 марта 2009

У меня есть строка получателей электронной почты в следующем формате:

 DECLARE @recipients VARCHAR(MAX);
 ....
 PRINT @recipients;
 /* the result
 person1@yahoo.com;person2@hotmail.com;person1@yahoo.com;...
 */

«SELECT DISTIECT ...» - это простой и мощный оператор SQL, но он работает с таблицей. Есть ли простой способ выбрать отличного получателя из переменной списка получателей, такой как цикл FOR в C # или Ruby?

 FOR @recipient IN @recipients
 BEGIN
    -- send email to @recipient
 END

Кстати, я использую TSQL в SQL Server 2005.

Ответы [ 4 ]

2 голосов
/ 18 марта 2009

Вот решение для вас, которое использует временную таблицу.

declare @emails varchar(2000)
set @emails = 'person1@yahoo.com;person2@hotmail.com;person1@yahoo.com;'

declare @results table (row int identity(1,1), email varchar(500))

while ((select charindex(';',@emails)) > 0)
begin   
    insert into @results select substring(@emails,1,charindex(';',@emails))
    select @emails = substring(@emails,charindex(';',@emails)+1,len(@emails))
end

select distinct email from @results

Идея состоит в том, чтобы постоянно анализировать электронную почту из строки, вставлять ее во временную таблицу и удалять проанализированный электронный адрес из оставшейся строки.

Вы можете использовать цикл через временную таблицу впоследствии для отправки ваших индивидуальных писем.

1 голос
/ 18 марта 2009

например.

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )
GO
0 голосов
/ 18 марта 2009

Я использую функцию, подобную приведенной ниже, для решения аналогичной ситуации при получении подобных списков из внешнего интерфейса. Тогда вы можете просто использовать этот код для возврата строки в виде таблицы:

SELECT DISTINCT String FROM dbo.GetTableFromStringList(@recipients)

Вы, вероятно, хотите сделать фактическую отправку электронного письма чем-то отличным от кода T-SQL.

Вот функция:

CREATE FUNCTION [dbo].[GetTableFromStringList]
(
    @StringList VARCHAR(1000),
    @Delimiter  CHAR(1) = ','
)
RETURNS @Results TABLE
(
    String  VARCHAR(1000)   NOT NULL
)
AS
BEGIN
    DECLARE
        @string     VARCHAR(1000),
        @position   SMALLINT

    SET @StringList = LTRIM(RTRIM(@StringList)) + @Delimiter
    SET @position = CHARINDEX(@Delimiter, @StringList)

    WHILE (@position > 0)
    BEGIN
        SET @string = LTRIM(RTRIM(LEFT(@StringList, @position - 1)))

        IF (@string <> '')
        BEGIN
            INSERT INTO @Results (String) VALUES (@string)
        END

        SET @StringList = RIGHT(@StringList, LEN(@StringList) - @position)
        SET @position = CHARINDEX(@Delimiter, @StringList, 1)
    END

    RETURN
END
0 голосов
/ 18 марта 2009

То, что вы хотите в функции Split, которая вернет вам таблицу для работы.

Существуют бесчисленные реализации вокруг , но я не знаю ни о встроенной, ни о консенсусе "лучших".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...