Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
Sql server 带参数return';当没有参数传递给函数时,s所有记录_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server 带参数return';当没有参数传递给函数时,s所有记录

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

我有一个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.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=''”等