我是sql服务器的新手,并且我有WHERE
子句,如下所示:
WHERE[D].[IsLocked] = 0
AND(@StartDate IS NULL OR ISNULL([TA].[ModifiedDate], [TA].[CreationDate]) >= @StartDate)
AND(@EndDate IS NULL OR ISNULL([TA].[ModifiedDate], [TA].[CreationDate]) <= @EndDate)
AND((CASE WHEN[T].[TaskStatusId] = '09E02513-00AD-49E3-B442-A9ED2833FB25'
THEN 1 ELSE 0 END) = @Completed)
AND((@FilterEmpKey IS NULL AND[TA].[EmpKey] = @CurrentEmpKey)
OR (ISNULL([TA].[ModifiedAssignedBy], [TA].[AssignatedBy]) = @FilterEmpKey
AND[TA].[EmpKey] = @CurrentEmpKey))
但是现在我想添加条件查询,以便在查询末尾添加更多过滤器,例如:
IF(@FilterEmpGuid IS NOT NULL)
AND[TA].[EmpKey] = @CurrentEmpKey
AND[TA].[AssignatedBy] = @CurrentEmpKey
AND[TA].[EmpKey] = @FilterEmpKey
但是我得到了
多部分标识符[TA]。[EmpKey]无法绑定
我在做什么错?
答案 0 :(得分:2)
IF条件语句仅在sql查询(例如过程等)中使用。
在查询本身中,您只能使用AND,OR和CASE语句,因此您需要为此重写IF条件:
AND (@FilterEmpGuid IS NULL
OR (
[TA].[EmpKey] = @CurrentEmpKey
AND[TA].[AssignatedBy] = @CurrentEmpKey
AND[TA].[EmpKey] = @FilterEmpKey
))
答案 1 :(得分:0)
您可以将其他过滤器选项移至标量函数中。
如果您知道可能要过滤的其他字段,则可以使用以下类似的方法:
CREATE FUNCTION dbo.ExtendFilter(
@column_value VARCHAR(50), @param_value VARCHAR(50)
)
RETURNS BIT
AS
BEGIN
DECLARE @return BIT = 1; -- default RETURN to 1 ( include ).
IF ( NULLIF( @param_value, '' ) IS NOT NULL )
BEGIN
-- compare the column's value to the param value
IF ( @column_value <> @param_value )
SET @return = 0; -- don't include this record.
END
RETURN @return;
END
GO
然后像这样使用它:
WHERE
{ other WHERE stuff }
AND dbo.ExtendFilter( [TA].[EmpKey], @CurrentEmpKey ) = 1
AND dbo.ExtendFilter( [TA].[AssignatedBy], @CurrentEmpKey ) = 1
AND dbo.ExtendFilter( [TA].[EmpKey], @FilterEmpKey ) = 1
请注意,这只是一个例子。您想检查@pram_value是否为NULL,等等...