Sql-Server

為表中的每個使用者 ID 生成 CSV 電子郵件

  • May 11, 2017

大家好,我有一個獨特的要求,我需要為每個使用者 ID 生成一個包含數據的 .csv 文件。我從 select 語句返回的結果集是

userID numOfSales saleDate meetMark

ec12 4 2017-01-02 否

ec12 3 2017-01-03 否

ss33 5 2017-01-10 否

因此,我想生成 2 個 .csv 文件,一個用於 ec12,一個用於 ss33,並將這些文件通過電子郵件發送到電子郵件地址。

下面是我的範例 DDL 和返回上述內容的查詢,如何for each在 SQL Server 中為上述 select 語句中的每個使用者 ID 生成一個 .csv 文件?

Create Table #bluebell
(
   userID varchar(100)
   ,numOfSales int
   ,saleDate date
   ,meetMark varchar(10)
)

Insert Into #bluebell (userID, numOfSales, saleDate, meetMark) Values
('ec12', '22', '20170101', 'Yes'),('ec12', '4', '20170102', 'No'),('ec12', '3', '20170103', 'No')
,('er11', '30', '20170101', 'Yes'), ('er11', '22', '20170103', 'Yes'), ('er11', '33', '20170109', 'Yes')
,('ss33', '40', '20170101', 'Yes'), ('ss33', '5', '20170110', 'No')

Select * FROM #bluebell where meetMark = 'No'


DROP TABLE #bluebell

以下將執行類似於FOREACH循環的操作:

CREATE TABLE #TableOne (
   UserId VARCHAR(5), 
   SalesNo INT, 
   DateSale DATE, 
   MarkMet BIT);

INSERT INTO #TableOne (
   UserId, 
   SalesNo, 
   DateSale, 
   MarkMet) VALUES
('ec12', 22, '2017-01-01', 1),
('ec12', 4,  '2017-01-02', 0),
('ec12', 3,  '2017-01-03', 0),
('er11', 30, '2017-01-01', 1),
('er11', 22, '2017-01-02', 1),
('er11', 33, '2017-01-03', 1),
('ss33', 40, '2017-01-02', 1),
('ss33', 5,  '2017-01-10', 0);

DECLARE @RowCount INT = (SELECT DISTINCT COUNT(*) UserId FROM #TableOne);
DECLARE @i INT = 1;
DECLARE @UserId VARCHAR(5);
DECLARE @Temp TABLE (id INT, userid VARCHAR(5));

INSERT INTO @Temp (id, userid)
SELECT
   ROW_NUMBER() OVER(ORDER BY t.UserId) AS Id
   ,t.UserId
FROM (
   SELECT DISTINCT
       UserId 
   FROM #TableOne) t;

WHILE (@i <= @RowCount)
BEGIN
   SET @UserId = (SELECT t.userid FROM @Temp t WHERE t.id = @i)

   /************************************************/
   /* Build the logic to be iterated per each user */
   /* (generate CSV, Send Mail, etc)               */
   /*                                              */
   /*    eg. SELECT *                              */
   /*        FROM #TableOne                        */
   /*        WHERE UserId = @UserId                */
   /*                                              */
   /************************************************/

   SET @i = @i + 1;
END

首先,它將創建一個臨時表來儲存每個唯一的 UserId,並根據 為它們分配一個偽 uidROW_COUNT,然後它將遍歷這個新創建的表以逐個獲取 UserId,此時您將能夠執行每個記錄/使用者 ID 的操作。

引用自:https://dba.stackexchange.com/questions/173344