【问题标题】:I want to give a parameter for a function from a value from with我想从 with 的值中为函数提供参数
【发布时间】:2012-11-06 07:22:15
【问题描述】:
WITH
EmpDetails(EmpCode)
AS
(
 SELECT EmpCode 
 FROM Employee.tblEmp_Demographics 
 WHERE RecordStatus='present' 
)  

    select *,ROW_NUMBER() OVER (PARTITION BY EmpCode ORDER BY DateTaken DESC) AS RowNum,    
    (select GradeName From Master.GradeMaster where GradeCode=Grade And Deleted=0) As Grade,    
    SUM(Amount) OVER(PARTITION BY Grade) AS EmpAmount,
    SUM(DependentAmount) OVER(PARTITION BY Grade) As DepAmount,
    0 As CheckNo 
    from [dbo].[SELECT_AIRTICKET_DETAILS_BY_DATE](EmpDetails.EmpCode,getdate(),1) WHERE YEAR(DateTaken)=year(getdate())

但我得到一个错误

Msg 4104,Level 16,State 1,Line 11 无法绑定多部分标识符“EmpDetails.EmpCode”。

【问题讨论】:

    标签: sql-server-2005


    【解决方案1】:

    我认为问题是您将列 EmpDetails.EmpCode 名称传递给表值函数而不是单个值的结果。你可以试试这个:

    DECLARE @EmpCode nvarchar(100);
    
    SELECT TOP 1
           @EmpCode = EmpCode 
      FROM Employee.tblEmp_Demographics
     WHERE RecordStatus='present';
    
    select *,ROW_NUMBER() OVER (PARTITION BY EmpCode ORDER BY DateTaken DESC) AS RowNum,    
    (select GradeName From Master.GradeMaster where GradeCode=Grade And Deleted=0) As Grade,    
    SUM(Amount) OVER(PARTITION BY Grade) AS EmpAmount,
    SUM(DependentAmount) OVER(PARTITION BY Grade) As DepAmount,
    0 As CheckNo 
    from [dbo].[SELECT_AIRTICKET_DETAILS_BY_DATE](@EmpCode,getdate(),1) WHERE YEAR(DateTaken)=year(getdate());
    

    如果您想要来自 Employee.tblEmp_Demographics 表的多个值的结果,您可以遍历每个值(可能不是最好的),或者修改您的表值函数以返回包含所有 EmpCode 值的结果集,然后添加一个WHERE 子句根据需要过滤数据。


    编辑

    可能是这样的——注意修改后的函数返回所有 EmpCodes 并且少了一个参数:

    select *,ROW_NUMBER() OVER (PARTITION BY EmpCode ORDER BY DateTaken DESC) AS RowNum,    
    (select GradeName From Master.GradeMaster where GradeCode=Grade And Deleted=0) As Grade,    
    SUM(Amount) OVER(PARTITION BY Grade) AS EmpAmount,
    SUM(DependentAmount) OVER(PARTITION BY Grade) As DepAmount,
    0 As CheckNo 
      FROM [dbo].[SELECT_AIRTICKET_DETAILS_BY_DATE](getdate(),1) AS [Tickets]
     INNER JOIN Employee.tblEmp_Demographics
             ON tblEmp_Demographics.EmpCode = [Tickets].EmpCode
            AND tblEmp_Demographics.RecordStatus = 'present'
     WHERE YEAR(DateTaken) = year(getdate());
    

    使用此解决方案,该函数返回所有 EmpCode,但我们通过在 Employee.tblEmp_Demographics 表上执行 INNER JOIN 过滤掉不必要的。

    【讨论】:

    • 其实我想从 Employee.tblEmp_Demographics 中给出一个值作为函数的参数
    • 第一个SELECT 语句从Employee.tblEmp_Demographics 表中获取值并将其保存在@EmpCode 变量中,该变量随后在第一个参数中传递给[SELECT_AIRTICKET_DETAILS_BY_DATE] 函数。
    • Employee.tblEmp_Demographics 中的所有 empcodes 都需要它
    • 我已经更新了答案以包含一个示例,您将调用表值函数的修改版本。如果您由于某种原因无法修改该函数,那么我认为您唯一的其他选择是递归遍历 Employee.tblEmp_Demographics 表中的每个值。虽然这不是最好的方法 - SQL Server 和递归不是一个很好的组合。
    猜你喜欢
    • 2018-05-15
    • 2011-03-04
    • 1970-01-01
    • 2012-02-03
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    相关资源
    最近更新 更多