【发布时间】:2019-04-01 14:12:54
【问题描述】:
我有一个游标,它遍历数据库中的每个基表。它通过执行一条动态 SQL 将记录插入到另一个表中,但目前执行需要 20 多分钟。
DECLARE TableCursor CURSOR FOR
SELECT TABLE_NAME
FROM <DB>.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
WHILE(@@FETCH_STATUS = 0)
BEGIN
#Dynamic SQL Query to insert data into each table in cursor#
我做了一些研究,发现使用带有 UNION 表达式的 CTE 会更快,但我不确定如何进行转换,例如如何循环 CTE 中的每个表。
非常感谢任何帮助。
EDIT:这是动态 SQL 的示例:
SELECT @SQL = 'WITH CTE_DATES(DATE_VAL) AS (
SELECT DISTINCT DATE_VAL
FROM DATE_EVERY_DAY
WHERE DATE_VAL <= GETDATE()
)
INSERT INTO COUNT_RECORDS_TABLE (DATE_VAL, TABLE_NAME, NUM_RECS_IMPORTED)
SELECT cd.DATE_VAL, ''' + @TableName + ''' AS TABLE_NAME, COUNT(CAST(tn.IMPORT_DATE AS DATE)) AS NUM_RECS_IMPORTED
FROM CTE_DATES AS cd LEFT JOIN ' + @TableName + ' AS tn
ON CAST(tn.IMPORT_DATE AS DATE) = cd.DATE_VAL
GROUP BY cd.DATE_VAL'
【问题讨论】:
-
AFAIK 您在这里没有太多选择,因为您需要动态 SQL 来为要运行的每个查询选择目标表。但是,这里的性能是一个大问题吗?您多久运行一次此代码?
-
@AJennings1 。 . .问题可能不是游标(在这种情况下),而是动态 SQL。
-
只注释掉执行 DynamicSQL 的行并重新计算它的时间。这将告诉您构建 DynamicSQL 是否是一个瓶颈。
-
一种解决方案是将要执行的脚本存储在一个文本文件中,然后使用 sqlcmd 执行它,在大多数情况下,可以使用 sql join 来创建 sql 脚本,但我需要了解有关您的脚本的更多详细信息以确认
-
@GordonLinoff 查看编辑
标签: sql-server tsql database-cursor