Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 捕获所有搜索,动态SQL?_Tsql_Sql Server 2005 - Fatal编程技术网

Tsql 捕获所有搜索,动态SQL?

Tsql 捕获所有搜索,动态SQL?,tsql,sql-server-2005,Tsql,Sql Server 2005,昨天我问了一个问题,关于我们试图在应用程序中重新编写/优化的过程。它来自一个搜索表单,用户可以指定一系列条件。40个参数,其中3个是GUI的长字符串,我将其传递到一个UDF中,该UDF返回一个表变量,所有3个参数都将从语句连接到主 我们使用动态SQL完成了大部分查询,我们编写整个查询的主要原因之一是因为它是动态SQL。我所读到的关于动态SQL的一切都是不好的,尤其是在执行计划和优化方面。然后我开始看到这两篇文章 我一直认为动态SQL不利于安全性和优化,我们已经尽可能将其从系统中删除。现在我们

昨天我问了一个问题,关于我们试图在应用程序中重新编写/优化的过程。它来自一个搜索表单,用户可以指定一系列条件。40个参数,其中3个是GUI的长字符串,我将其传递到一个UDF中,该UDF返回一个表变量,所有3个参数都将
语句连接到主

我们使用动态SQL完成了大部分查询,我们编写整个查询的主要原因之一是因为它是动态SQL。我所读到的关于动态SQL的一切都是不好的,尤其是在执行计划和优化方面。然后我开始看到这两篇文章

我一直认为动态SQL不利于安全性和优化,我们已经尽可能将其从系统中删除。现在我们正在重新构造系统中执行最多的查询(主搜索查询),我们认为剥离所有动态SQL会有所帮助

基本上取代

IF(@Param1 IS NULL)
   @SQLString = @SQLString + " AND FieldX = @Param1"
...execute the @SQLString
有一个大的SQL块

WHERE (@Param1 IS NOT NULL AND FieldX = @Param1)

读了这两篇文章,似乎这对我不利。我不能使用
重新编译
,因为我们仍然处于2k5状态,即使可以,这个存储过程的使用率也非常高。我真的想用动态SQL编写这个查询吗?如果无法存储执行计划,如何加快速度?

查询提示
重新编译
是。动态查询的查询计划也被缓存。当查询结构每次运行时都发生更改时,如何缓存查询计划?WHERE子句中根本不包含不存在的变量,并且一个调用可能与另一个调用完全不同。此外,我认为重新编译仅适用于2k8和forward?您是否考虑过评估哪些参数最常见,可能是最常见的几个参数,以便生成自定义存储过程?@IshmaelStruan,关于重新编译选项,请参见我第一条评论中的链接。关于动态查询:假设我们执行动态查询(#1)=
从[table]中选择名称,其中id=@id
(@id=1),然后执行另一个(#2)=
从[table]中选择名称,其中id=@id和date>@date
(@some\u id,@some\u date),在这种情况下,是的,查询计划可能不同,但如果再次执行#1(@id=2)缓存命中很有可能发生。