【发布时间】:2021-11-25 21:03:28
【问题描述】:
现在我有类似的东西:
CREATE PROCEDURE [dbo].[sp_GetFilteredInformation]
@pItem nvarchar(max) = NULL,
@pCity nvarchar(max) = NULL,
@pSerialN nvarchar(max) = NULL,
@pPromise datetime = NULL,
@pSalesOrder nvarchar(max) = NULL,
@pLineNumber int = NULL
DECLARE @vQuery nvarchar(max)
IF (@pItem IS NOT NULL)
BEGIN
SET @vQuery += 'AND ITEM LIKE '' + @pItem + '''
END
IF (@pCity IS NOT NULL)
BEGIN
SET @vQuery += 'AND CITY LIKE '' + @pCity + '''
END
...等等,所以最后我会有
SELECT *
FROM TABLE
WHERE 1 = 1 + @vQuery
我认为这会奏效,但对我来说似乎效率不高。有没有办法优化此过程并使用多个参数过滤信息,其中一些参数为空?
【问题讨论】:
-
警告:您的代码危险。您正在将参数注入到动态语句中,而不是参数化它们。这尤其是更糟糕,因为你正在给恶意的人提供 8GB(或 40 亿个字符)来玩。
-
这种厨房水槽查询的特殊方法实际上是最有效的,只是你需要确保将实际数据参数一路传递,使用
sp_executesql,不要注入它们跨度> -
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
“关于点,这是一个错字”但是
sp_前缀也是一个问题,不应该使用。跨度>
标签: sql sql-server database tsql