Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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 存储过程中,找到重复的文件名并返回值_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql 存储过程中,找到重复的文件名并返回值

Sql 存储过程中,找到重复的文件名并返回值,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我有逻辑来验证文件名是否唯一。为此,我需要传递参数“FileName” 逻辑: SELECT value = COUNT(*) FROM ProcessingLog WHERE ProcessingOutcome IN (1,2) AND FileName = [FileName] IF value <> 0 THEN RETURN ErrorID 2 如何将errorID传递到处理中?以下内容将满足您的要求 您的参数名称不需要是输出 您的参数名称确实需要与查询

我有逻辑来验证文件名是否唯一。为此,我需要传递参数“FileName”

逻辑:

SELECT value = COUNT(*)  
FROM  ProcessingLog
WHERE ProcessingOutcome IN (1,2)  
AND FileName = [FileName] 

IF value <> 0 THEN  
RETURN ErrorID 2 

如何将errorID传递到处理中?

以下内容将满足您的要求

您的参数名称不需要是输出 您的参数名称确实需要与查询中使用的参数匹配。 在这种情况下,只需要一个简单的exists,不需要计数。 并插入到表中

declare @FileName nvarchar(256) = 'MyTestFileName.txt', @Result int;

exec @Result = dbo.xx @FileName;

insert into ProcessingLog (ErrorId, FileName)
select @Result, @FileName
where @Result = 2;
insert into ProcessingLog (ErrorId, FileName)
select ErrorId, @FileName
from (
    select FileExists from dbo.xx(@FileName)
) x
where x.FileExists = 2;
注意:这实际上并不需要存储过程,如果您想在多个位置重用此查询,请将其放入内联表值函数中,例如

CREATE FUNCTION [dbo].[xx]
(    
  @FileName int = NULL
)
returns table
return
  select case when exists (
    SELECT 1
    FROM PbrcServiceProcessingLog  
    WHERE ProcessingOutcome IN (1,2) AND SourceFileName = @FileName 
  )
  then 2 else 0 end FileExists;
然后,对于单个值,将其用作:

select FileExists from dbo.xx(@FileName);
或者,要对表中的列进行调用,请使用:

select Filename
  , (select FileExists from dbo.xx(FileName)) FileExists
from MyTable;
并插入到表中

declare @FileName nvarchar(256) = 'MyTestFileName.txt', @Result int;

exec @Result = dbo.xx @FileName;

insert into ProcessingLog (ErrorId, FileName)
select @Result, @FileName
where @Result = 2;
insert into ProcessingLog (ErrorId, FileName)
select ErrorId, @FileName
from (
    select FileExists from dbo.xx(@FileName)
) x
where x.FileExists = 2;

所以为了澄清,您想传入一个文件名并返回一个值来指示它是否存在?是的。0表示新文件名,值2表示存在重复文件。Thx@song你面临什么问题?我可以在您的查询/过程中看到几个问题。为什么将“@FileName”作为输出参数?您已在查询中使用了“@SourceFileName”参数,但未在过程“@SourceFileName”中声明/传递。您在select中使用了文件名,但分组是在SourceFileName上完成的。因为它只返回标量值,所以我们不需要表值UDF。我认为scalar UDF就足够了。@VenkataramanR标量函数的性能非常糟糕,而内联表值函数的性能大多相当好。同意。但是,在这里,当我们只是检查fileexistance时,我认为内联表值函数有点过头了。如果有一个重复的文件,那么输出是2,我如何将值2和文件名放入输出目标表“ProcessingLog”的ErrorID列、filename列。许多的Thanks@VenkataramanR过度杀戮?定义的行数相同,原则上我总是使用ITVF来避免将来的性能问题。这是我的默认函数类型。我不惜一切代价避免使用标量函数,并建议其他人也这样做。我建议使用标量函数的唯一一次是,如果出于某种原因ITVF性能不好——这可能会发生。