【发布时间】:2011-09-24 22:08:17
【问题描述】:
DECLARE tableList CURSOR FOR
SELECT t.name
FROM sys.tables t
INNER JOIN sys.columns c
ON t.object_id = c.object_id
WHERE
t.name NOT LIKE 'z%'
AND t.name NOT LIKE '%delete%'
AND t.name <> 'tblUsers'
AND t.name <> 'tblUserLogins'
AND t.name <> 'searchR'
AND t.name <> 'tblUserPortfolio'
AND t.name <> 'alerts_User'
AND c.name LIKE 'userid'
OR c.name LIKE 'user_id'
ORDER BY name
OPEN tableList
FETCH NEXT FROM tableList
INTO @tablename
上面是构建游标的查询,它使用了很多LIKE、NOT LIKE 操作,我认为这些操作运行起来可能很昂贵。
所以我想问是否有更好的方法来构建查询而不使用太多LIKE/NOT LIKE 并使其更优化。
谢谢。
编辑:
这里使用游标的目的是Loop Through所有匹配的表,这样我们就可以动态地插入/更新/删除记录。
我正在使用的数据库中有150多个表,所以我认为sql server还不如做脏活。
【问题讨论】:
-
我怀疑这里真正的问题是
CURSOR,而不是查询...另外:不要假设它们很贵;尤其是在 sys.tables 和 sys.columns 上,其中的行量不会太大 -
最后两个条件(与
OR结合)可能应该放在括号中,否则最后一个会丢弃所有以前的AND条件。
标签: sql sql-server tsql optimization stored-procedures