0

最常见的答案是:不,不要使用游标,不要使用动态 SQL

但是这个问题是从一种看起来很漂亮但可能是不好的做法、较重的处理速度和 SQL 注入(?)的编码风格中征求反馈。

我之所以学会这种风格,是因为对复制粘贴集查询感到烦恼,每个查询之间只有一个或两个项目发生变化。我发现这种风格更容易执行代码审查,因为只有一个代码块,无需上下滚动。

一个示例用例是:一个大型慢表,其中包含来自 20 家不同保险公司的历史数据,17 亿行乘 200 列。为了进行富有成效的分析,将 10 列检索到 20 家保险公司中的每家的单独表中。

游标/动态组合之前,为一个计划构建查询和代码审查,然后复制 19 次,每次检索不同的计划。

使用游标/动态组合后,有一个 20 项游标和一个动态 SQL 块。明智地审查,它似乎更一致,更不容易出现人为错误。

该组合的代码示例如下:

Declare @company_name varchar(10)
       ,@SQL_STATEMENT varchar(100)

Declare company_cursor cursor fast_forward for  (
SELECT * FROM (VALUES('APPLE'),('GOOGLE'),('AMAZON')) AS TABLE_NAME(COLUMN_NAME)
)

open company_cursor
fetch next from company_cursor into @company_name

while @@fetch_status = 0
begin
    set @SQL_STATEMENT = 'select * from database.schema.'+@company_name
    print (@SQL_STATEMENT)
    fetch next from company_cursor into @company_name 
end 
close company_cursor 
deallocate company_cursor   

我还注意到,如果将 PRINT 结果复制到 SQL 编辑器中,则使用 PRINT 而不是 EXEC 会立即打印查询语句并充当代码生成器。

有人可以围绕这种 T-SQL 编码风格提供意见、建议或一般实践规则吗?(支持反对票...嗅探)

4

0 回答 0