2014-09-30 39 views
0

我在查询中发送一个电子邮件列表,但我得到一个错误,说它不能处理更多然后2100,我肯定有更多的可能是那个数量的三倍。我该如何分批处理这批配料的处理?SQL - 创建一个批处理 - SQL LIMIT为2100

sql = """with x as (\ 
          select \ 
           job_id, \ 
           avg_runtime, \ 
           j.id, \ 
           row_number() over (partition by ja.job_id order by ja.id desc) rn \ 
          from job_activity as ja \ 
          join job as j on ja.job_id = j.id \ 
          where \ 
           j.name in ({0}) and \ 
           ja.avg_runtime <> 0 and \ 
           ja.avg_runtime is not null) \ 
          select \ 
           job_id, \ 
           avg_runtime, \ 
           id \ 
          from x where rn = 1 ";""" 



      params = ",".join(map(lambda x: "?", flagged_job_names)) 
      dataSet = data.Engine.execute(sql.format(params), flagged_job_names) 
      dataSet.fetchall() 
+0

那么......你连接到哪个SQL RDBMS? – 2014-09-30 16:11:25

+0

MS SQL 11与pyodbc – user3590149 2014-09-30 16:31:10

回答

0

这里是我们做什么:

  1. 发送电子邮件列表中的一个巨大的逗号分隔字符串
  2. 使用下面之交的TVF,列出到一个表相当于
  3. 使用常规连接声明
下面

伪代码:

DECLARE @emails varchar(max); 
SET @emails = '[email protected];[email protected]'; 

SELECT * 
FROM table1 t 
    INNER JOIN dbo.tvf_splitParam(@emails, ',') tvf ON (t.email = tvf.value) 





ALTER FUNCTION [dbo].[tvf_SplitParam](
    @RepParam nvarchar(max), 
    @Delim char(1)= ',' 
) 
RETURNS @VALUES TABLE (value nvarchar(max))AS 
    BEGIN 
    DECLARE @chrind INT 
    DECLARE @Piece nvarchar(max) 
    SELECT @chrind = 1 
    WHILE @chrind > 0 
     BEGIN 
     SELECT @chrind = CHARINDEX(@Delim,@RepParam) 
     IF @chrind > 0 
      SELECT @Piece = LEFT(@RepParam,@chrind - 1) 
     ELSE 
      SELECT @Piece = @RepParam 
     INSERT @VALUES(value) VALUES(@Piece) 
     SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind) 
     IF LEN(@RepParam) = 0 BREAK 
     END 
    RETURN 
END 
0

对于SQL Server 2012,你可以使用table valued parameters

-- How to create an array for storing emails ? (SQL2008+) 
CREATE TYPE dbo.StringArray AS TABLE ( 
    Value NVARCHAR(100) NOT NULL 
); 
GO 

-- How to create a procedure having this array as parameter ? 
CREATE PROCEDURE dbo.DoSomething (
    @emails dbo.StringArray READONLY 
) 
AS 
BEGIN 
    SELECT * 
    FROM dbo.Person p 
    WHERE p.Email IN (SELECT v.Value FROM @emails v) 
END; 
GO 

-- How to call this procedure ? 
DECLARE @param dbo.StringArray 
INSERT @param 
VALUES ('[email protected]'), ('[email protected]'), ('[email protected]') 

EXEC dbo.DoSomething @emails = @param 

注:厄兰Sommarskog编制用于存储/在SQL Server here通过阵列解决方案的完整列表。