2009-03-18 28 views
0

私はこのような形式の電子メール受信者の列を持っている:選択項目が

DECLARE @recipients VARCHAR(MAX); 
.... 
PRINT @recipients; 
/* the result 
[email protected];[email protected];[email protected];... 
*/ 

は「DISTIECTをSELECT ...」シンプルかつ強力なSQL文があるが、それは不利に働きます表。 受取人をC#またはRubyのFORループのような受信者リスト変数から選択する簡単な方法はありますか?ところで

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

、私はあなたがで動作するためのテーブルを返しますSplit関数にしたいどのようなSQLサーバーに2005

答えて

2

ここでは、一時テーブルを使用するソリューションを紹介します。

declare @emails varchar(2000) 
set @emails = '[email protected];[email protected];[email protected];' 

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 

アイデアは継続的に、文字列から電子メールを解析し、一時テーブルに挿入し、残りの文字列から解析された電子メールを削除することです。

その後、テンポラリテーブルをループして個々のメールを送信することができます。

0

をTSQLを使用しています。

無制限の実装aroundがありますが、私は組み込みのもの、または「ベスト」のコンセンサスを認識していません。

+0

あなたの提案が見えます。この関数は2つのパラメータを受け取ります。一つは受信者、もう一つは ';'のような区切り文字です。デフォルトで。そうですか? –

+0

デリミタは、好きなものをデフォルトにすることができます。 「単純なT-SQL方法」 - 関数はT-SQLのビルトイン部分であり、SQL Server 2005以降、テーブル値関数が使用されています。 –

+0

@David Chu:Sql Serverには単純な方法はありません。 –

1

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

エラーが発生しました: 再帰的クエリの「開始」列のアンカーと再帰部分の型が一致しません –

+0

OK。私はエラーを解決しました。私は@svarchar(max)を使用しました。なぜmaxがここで働いていないのか分かりません。 512または4000はOKです –

0

フロントエンドからそのようなリストを受け取った場合、同様の状況に対処するために、以下のような関数を使用します。次に、あなただけの代わりに、テーブルなどの文字列を返すために、このコードを使用することができます:あなたは、おそらく実際にはかかわらず、T-SQLコード以外に、電子メールの送信を行いたい

SELECT DISTINCT String FROM dbo.GetTableFromStringList(@recipients) 

はここで機能だ:これは単純なTSQLの方法ではありませんように

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 
関連する問題