【发布时间】:2016-12-01 22:54:06
【问题描述】:
我正在尝试运行一个应该加载超过 200M 记录的动态 SQL 查询。我试图一次加载所有记录,但得到了“System.OutOfMemory”异常,因此决定将时间间隔分成几个月。即使我只运行了一个月,以下运行了一个多小时。我对日期进行了硬编码,并在没有“While”的情况下运行它,它运行正常。有人可以检查并让我知道其中是否有错误。 以下是我的查询
DECLARE @FromDate VARCHAR(MAX)='',
@params nvarchar(max) = N'@StartDate Date out,@EndDate Date out,@FromDate date out,@ToDate date out',
@SQL NVARCHAR(MAX)=’’,
@ToDate VARCHAR(MAX)='',
@StartDate VARCHAR(MAX)=’’,
@EndDate VARCHAR(MAX)=’’;
SELECT @FromDate= DATEADD(DAY,-365, GETUTCDATE()), @ToDate = GETUTCDATE();
SELECT @StartDate=@FromDate, @EndDate=CAST(DATEADD(MONTH,1, @FromDate) AS DATE);
SET @SQL = '
WHILE ''' + @FromDate + ''' < ''' + @ToDate + '''
BEGIN
INSERT INTO dbo.Sales
(
ProductID,
SaleDate,
Quantity
)
Select
ProductID,
SaleDate,
Quantity
from
OPENQUERY(TeraData1,''
Select
PR_ID AS ProductID,
SL_Date AS SaleDate,
PR_QTY AS Quantity
FROM
Sales.Product
where
SaleDate BETWEEN ' + @StartDate + 'AND '+ @EndDate + '
'')
SET @FromDate =DATEADD(MONTH,1,'''+ @FromDate +''')
SET @StartDate =DATEADD(MONTH,1,'''+ @StartDate +''')
SET @EndDate =DATEADD(MONTH,1,'''+ @EndDate +''')
END’
EXECUTE sp_executesql @SQL, @params,
@FromDate=@FromDate,
@ToDate=@ToDate,
@StartDate = @StartDate out,
@EndDate = @EndDate out;
【问题讨论】:
-
为什么不使用存储过程/函数逻辑而不是动态SQL?
-
@TonyDong 有一点在您展示的语法中没有任何需要动态 sql 的内容,您可以使用常规的 WHILE 控制语法。尽管有点难以分辨,但问题可能是您在动态 sql 和控制流中混合了变量的范围
-
你也在混合一些数据类型,这可能是问题的一部分
标签: sql sql-server tsql dynamic-sql