.net 从SQL数据库中保存的数据生成代码:应该在存储过程中还是在Web服务器上执行

.net 从SQL数据库中保存的数据生成代码:应该在存储过程中还是在Web服务器上执行,.net,sql-server,performance,code-generation,sql-server-2008-r2,.net,Sql Server,Performance,Code Generation,Sql Server 2008 R2,我有一个SQL Server 2008数据库,其中包含我需要用来生成代码的数据(实际上,我需要生成一个SQL脚本来填充另一个具有不同结构的数据库,但请不要被它误导-这是一个基本上基于数据生成一个大文本块的问题) 我关心表现。因此,一般来说,这样做会更有效吗 a) 在SQL Server上的存储过程中生成代码: Pro:数据不必通过网络移动,因此延迟问题较少(尽管完成的文本块必须通过较大的网络发送) Con:在T-SQL中操作数据很麻烦(游标),而在T-SQL中操作字符串(我可以想象)要比在web

我有一个SQL Server 2008数据库,其中包含我需要用来生成代码的数据(实际上,我需要生成一个SQL脚本来填充另一个具有不同结构的数据库,但请不要被它误导-这是一个基本上基于数据生成一个大文本块的问题)

我关心表现。因此,一般来说,这样做会更有效吗

a) 在SQL Server上的存储过程中生成代码:

Pro:数据不必通过网络移动,因此延迟问题较少(尽管完成的文本块必须通过较大的网络发送)

Con:在T-SQL中操作数据很麻烦(游标),而在T-SQL中操作字符串(我可以想象)要比在web服务器(.NET)上慢

b) 检索我需要的数据并在web服务器上生成代码:

Pro:更快、更灵活的字符串处理

Con:从SQL框中返回所有数据

为了解决这个问题,我们可以考虑使用大约100000行< /P>的数据。
更新: 我没有提到我的目标是从表单提交生成脚本,并将结果直接发送回浏览器。因此,在这种情况下,使用SSI之类的解决方案的用途可能有限

请研究使用SSI(SQL Server集成服务)。SSI允许转换,并且应该能够处理大型集合的批处理等

当然,如果您需要操作的即时响应,那么SSIS不会有多大帮助。如果转换不是非常复杂,并且可以在单个查询中完成,那么您可以选择使用CLR,正如这里已经建议的那样。我编写了一个名为SQL#(SQLsharp)的SQL CLR函数和过程库,可以在以下位置找到:并且大部分是免费的。您可以使用DB_BulkCopy存储过程来实现这一点(同样,这取决于转换的复杂性)。DB_BulkCopy过程在免费版本中可用,并且基于.Net SqlBulkCopy类(如果您想编写自己的SQL CLR方法)。但这允许您定义一个查询,用于将结果集发送到目标连接(SQL Server或Oracle)。此过程处理批处理操作,因此,如果您不希望传输100000行,它将不是一个事务。

请研究使用SSIS(SQL Server集成服务)。SSI允许转换,并且应该能够处理大型集合的批处理等


当然,如果您需要操作的即时响应,那么SSIS不会有多大帮助。如果转换不是非常复杂,并且可以在单个查询中完成,那么您可以选择使用CLR,正如这里已经建议的那样。我编写了一个名为SQL#(SQLsharp)的SQL CLR函数和过程库,可以在以下位置找到:并且大部分是免费的。您可以使用DB_BulkCopy存储过程来实现这一点(同样,这取决于转换的复杂性)。DB_BulkCopy过程在免费版本中可用,并且基于.Net SqlBulkCopy类(如果您想编写自己的SQL CLR方法)。但这允许您定义一个查询,用于将结果集发送到目标连接(SQL Server或Oracle)。此过程处理批处理操作,因此,如果您不希望传输100000行,它将不会是单个事务。

从纯经验的角度来看,SQL Server执行字符串操作的速度比代码慢得多

我重新考虑了几个程序,这些程序从一个源获取数据,对其进行操作,然后将其放入另一个源中,通过使用数据集和System.Text.StringBuilders将所有字符串操作移动到代码中,实现了第一个最佳性能增益

我终于找到了一些文档来支持这一点:

此外,托管代码与其他代码相比具有决定性的性能优势 Transact-SQL的过程代码、计算和字符串 操纵计算密集型的CLR函数 不执行数据访问最好用托管代码编写

也就是说,尝试这两种方法并对它们进行基准测试,然后权衡您的选择可能不会有什么坏处。除了性能之外,考虑可读性、未来维护的容易性等因素。如果在基准测试中性能不同的话,其他因素可能变得更重要。

阅读关于其他答案的其他注释,可能是安全性而不是性能应该是决定因素。一般来说,在代码中操纵字符串和清理任何可能不受信任的用户输入以防止SQL注入、XSS等更容易。在纯T-SQL中可以转义字符串,但在代码中,您可以基于输入创建参数化查询,而不是转义字符串。这在T-SQL中几乎是不可能的

从OWASP:

第三种技术是在将用户输入放入 查询如果您担心将动态查询重写为 准备好的语句或存储过程可能会破坏应用程序 或者对性能产生不利影响,那么这可能是最好的方法 为你。然而,这种方法与使用 参数化查询。此技术应仅在以下情况下使用: 注意,以经济高效的方式改装旧代码。应用 从头开始构建,或要求低风险容限的应用程序 应使用参数化查询构建或重新编写


从纯粹的经验来看,SQLServer执行字符串操作的速度比代码慢得多

我重新考虑过