Performance (如果过滤器有一个单独的变量,这是最简单的-例如@其中,连接为倒数第二步)重新签名:-这允许用户调用SP(并使其工作),即使无需选择访问表-无需签名,EXEC将使用用户的权限。注:我在现实生活中从来没有签过什么东西。。。也许可以忽略它。对于我使用的大型数据
Performance (如果过滤器有一个单独的变量,这是最简单的-例如@其中,连接为倒数第二步)重新签名:-这允许用户调用SP(并使其工作),即使无需选择访问表-无需签名,EXEC将使用用户的权限。注:我在现实生活中从来没有签过什么东西。。。也许可以忽略它。对于我使用的大型数据,performance,tsql,parameters,Performance,Tsql,Parameters,(如果过滤器有一个单独的变量,这是最简单的-例如@其中,连接为倒数第二步)重新签名:-这允许用户调用SP(并使其工作),即使无需选择访问表-无需签名,EXEC将使用用户的权限。注:我在现实生活中从来没有签过什么东西。。。也许可以忽略它。对于我使用的大型数据集,我发现这个方法(虽然干净)比(@parm2为NULL或Field2=@parm2)慢,如果Field1是一个可为NULL的值怎么办;那么,编写COALESCE(Field1,“)=COALESCE(@parm1,Field1,”)的位置是否
(如果过滤器有一个单独的变量,这是最简单的-例如@其中,连接为倒数第二步)重新签名:-这允许用户调用SP(并使其工作),即使无需选择访问表-无需签名,EXEC将使用用户的权限。注:我在现实生活中从来没有签过什么东西。。。也许可以忽略它。对于我使用的大型数据集,我发现这个方法(虽然干净)比(@parm2为NULL或Field2=@parm2)慢,如果Field1是一个可为NULL的值怎么办;那么,编写COALESCE(Field1,“)=COALESCE(@parm1,Field1,”)的位置是否是一个好的做法呢?是的,10年后,至少在MS SQL Server中仍然如此。和你们一样,我错误地假设“若@thing为null,则语句应该短路为true,因此不需要表扫描。”。。。因此,在具有15个参数的400K线路上的每个请求需要10秒以上的时间!
(@thing IS NULL or Thing=@thing)
WHERE Thing = ISNULL(@Thing, Thing)
DECLARE @sql nvarchar(4000)
SET @sql = /* core query */
IF @name IS NOT NULL
SET @sql = @sql + ' AND foo.Name = @name'
IF @dob IS NOT NULL
SET @sql = @sql + ' AND foo.DOB = @dob'
// etc
EXEC sp_ExecuteSQL @sql, N'@name varchar(100), @dob datetime',
@name, @dob
create procedure usp_TEST_COALESCE
(
@parm1 varchar(32) = null,
@parm2 varchar(32) = null,
@parm3 int = null
)
AS
SELECT *
FROM [TableName]
WHERE Field1 = COALESCE(@parm1, Field1)
AND Field2 = COALESCE(@parm2, Field2)
AND Field3 = COALESCE(@parm3, Field3)
WHERE (id = @id OR @id IS NULL)
AND (num = @num OR @num IS NULL)
DECLARE @sql nvarchar(4000)
DECLARE @where nvarchar(1000) =''
SET @sql = 'SELECT * FROM MyTable'
IF @Param1 IS NOT NULL
SET @where = @where + ' AND Field1 = @Param1'
IF @Param2 IS NOT NULL
SET @where = @where + ' AND Field2 = @Param2'
IF @Param3 IS NOT NULL
SET @where = @where + ' AND Field3 = @Param3'
-- Add WHERE if where clause exists, 1=1 is included because @where begins with AND
IF @where <> ''
SET @sql = @sql + ' WHERE 1=1' + @where
--Note that we could also create order parameters and append here
SET @sql = @sql + ' ORDER BY Field1'
WHERE COALESCE(Thing,'')=COALESCE(@thing,Thing,'')