Sql server 带参数return';当没有参数传递给函数时,s所有记录
我有一个SQL server存储过程,我希望它在没有参数传递给它时返回所有记录,我测试它正在返回的过程,在删除生成的最小和最大参数时返回所有记录,然后执行它Sql server 带参数return';当没有参数传递给函数时,s所有记录,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有一个SQL server存储过程,我希望它在没有参数传递给它时返回所有记录,我测试它正在返回的过程,在删除生成的最小和最大参数时返回所有记录,然后执行它 alter PROCEDURE SearchBYProjects @location NVARCHAR(50), @purpose NVARCHAR(50), @type NVARCHAR(50), @min NVARCHAR(50), @max NVARCHAR(50) AS SELECT p.ID, p.Project
alter PROCEDURE SearchBYProjects
@location NVARCHAR(50),
@purpose NVARCHAR(50),
@type NVARCHAR(50),
@min NVARCHAR(50),
@max NVARCHAR(50)
AS
SELECT
p.ID,
p.ProjectName,
p.Areas,
p.PaymentSystem,
p.ReceivedDate,
p.PropertyClassification,
p.ProjectImage,
l.LocationName,
Pur.PurposeName,
t.TypeName
FROM dbo.Projects AS p
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID
LEFT JOIN dbo.Purpose pur ON p.PurposeID = pur.ID
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
AND UPPER(ISNULL(p.Areas,'')) BETWEEN @min AND @max
GO
EXEC dbo.SearchBYProjects @location ='',@purpose='',@type='',@min='',@max=''
非常感谢您的帮助。也许:
alter PROCEDURE SearchBYProjects
@location NVARCHAR(50) = null,
@purpose NVARCHAR(50) = null,
@type NVARCHAR(50) = null,
@min NVARCHAR(50) = null,
@max NVARCHAR(50) = null
AS
SELECT
p.ID,
p.ProjectName,
p.Areas,
p.PaymentSystem,
p.ReceivedDate,
p.PropertyClassification,
p.ProjectImage,
l.LocationName,
Pur.PurposeName,
t.TypeName
FROM dbo.Projects AS p
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID
LEFT JOIN dbo.Purpose pur ON p.PurposeID = pur.ID
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
WHERE (@location is null or UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%')
AND (@purpose is null or UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%')
AND (@type is null or UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%')
AND (@min is null or UPPER(ISNULL(p.Areas,'')) >= @min)
AND (@max is null or UPPER(ISNULL(p.Areas,'')) <= @max)
GO
EXEC dbo.SearchBYProjects
将返回类型为'SomeType'的所有内容
值得一提的是,如果“Areas”是一个字符串,那么它可能不会像预期的那样起作用,例如,“110”位于“2”之前,介于“10”和“20”之间。因此,如果这些是数字,那么您可能希望在where子句中转换它们 也许是这样:
alter PROCEDURE SearchBYProjects
@location NVARCHAR(50) = null,
@purpose NVARCHAR(50) = null,
@type NVARCHAR(50) = null,
@min NVARCHAR(50) = null,
@max NVARCHAR(50) = null
AS
SELECT
p.ID,
p.ProjectName,
p.Areas,
p.PaymentSystem,
p.ReceivedDate,
p.PropertyClassification,
p.ProjectImage,
l.LocationName,
Pur.PurposeName,
t.TypeName
FROM dbo.Projects AS p
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID
LEFT JOIN dbo.Purpose pur ON p.PurposeID = pur.ID
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
WHERE (@location is null or UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%')
AND (@purpose is null or UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%')
AND (@type is null or UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%')
AND (@min is null or UPPER(ISNULL(p.Areas,'')) >= @min)
AND (@max is null or UPPER(ISNULL(p.Areas,'')) <= @max)
GO
EXEC dbo.SearchBYProjects
将返回类型为'SomeType'的所有内容
值得一提的是,如果“Areas”是一个字符串,那么它可能不会像预期的那样起作用,例如,“110”位于“2”之前,介于“10”和“20”之间。因此,如果这些是数字,那么您可能希望在where子句中转换它们 仅添加:
or coalesce(@location,@purpose,@type,@min,@max) is null
尽量不要对搜索的参数使用函数。当您将函数用于(ISNULL、COALESCE、UPPER、udf…)时,您的参数不再是SARG。如果没有必要,请不要将like与“%dasda”一起使用-对名称、位置、目的(或非结构化数据)使用全文搜索。仅添加:
or coalesce(@location,@purpose,@type,@min,@max) is null
尽量不要对搜索的参数使用函数。当您将函数用于(ISNULL、COALESCE、UPPER、udf…)时,您的参数不再是SARG。如果没有必要,请不要将like与“%dasda”一起使用-对名称、位置、目的(或非结构化数据)使用全文搜索。肖恩和戴德希普39所说的一切也是如此。为了扩展deadsheep39所说的内容,您的WHERE子句可以如下所示:
WHERE
(
UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
AND UPPER(ISNULL(p.Areas,'')) BETWEEN @min AND @max
)
OR COALESCE(@location,@purpose,@type,@min,@max) IS NULL;
如果你走这条路,一定要看肖恩贴的文章
因为您在存储过程中执行此操作,所以您也可以在您的过程中这样处理此需求(我就是这样做的):
然后,在执行proc时,您总是希望重新编译。例如:
EXECUTE <your proc> WITH RECOMPILE;
重新编译执行;
肖恩和戴德希普39所说的一切也是如此。为了扩展deadsheep39所说的内容,您的WHERE子句可以如下所示:
WHERE
(
UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
AND UPPER(ISNULL(p.Areas,'')) BETWEEN @min AND @max
)
OR COALESCE(@location,@purpose,@type,@min,@max) IS NULL;
如果你走这条路,一定要看肖恩贴的文章
因为您在存储过程中执行此操作,所以您也可以在您的过程中这样处理此需求(我就是这样做的):
然后,在执行proc时,您总是希望重新编译。例如:
EXECUTE <your proc> WITH RECOMPILE;
重新编译执行;
我想在没有参数的情况下执行该过程,并返回所有记录您编写的此过程必须通过参数才能返回所有记录?,我将区域列数据类型从nvarchar更改为int datatype,这也不起作用,因为如果我不传递参数,我想返回所有记录?这一行我想执行EXEC dbo.SearchBYProjects@location='',@purpose='',@type='',@min='',@max='',这将起作用,但可能会对性能产生严重影响。请看一看本文,了解如何改进这种类型的“一网打尽”查询。鉴于OP希望返回所有记录,我假设它的数据量不是很大,所以性能应该很好。hashim如果您想让我的代码与那样的参数一起工作,您可以在代码中的任何地方用“=””替换“is null”。或将“或@location=''”等添加到where子句的每个部分,我希望在其中执行无参数的过程并返回所有记录。您编写此命令时,必须传递参数才能返回所有记录?,我将区域列数据类型从nvarchar更改为int datatype,这也不起作用,因为如果我不传递参数,我想返回所有记录?这一行我想执行EXEC dbo.SearchBYProjects@location='',@purpose='',@type='',@min='',@max='',这将起作用,但可能会对性能产生严重影响。请看一看本文,了解如何改进这种类型的“一网打尽”查询。鉴于OP希望返回所有记录,我假设它的数据量不是很大,所以性能应该很好。hashim如果您想让我的代码与那样的参数一起工作,您可以在代码中的任何地方用“=””替换“is null”。或在where子句的每个部分添加“或@location=''”等