【问题标题】:SQL Server user-defined function return nothingSQL Server 用户定义函数不返回任何内容
【发布时间】:2012-10-10 21:00:35
【问题描述】:

以下查询是为 SQL Server 编写的,如果我对 @TempStaff 进行硬编码,那么它可以正常工作,并且 @Tempstaff 中有一个值,但是这样的代码不会返回任何内容。

查询是收集员工级别及以下的所有员工:

DECLARE 
    @TempStaff  varchar(10),
    @staff_Full_name varchar (30)   
BEGIN
SELECT @staff_Full_name = 'Doe, John'
DECLARE @staffNameTable TABLE
    (
    StaffID     char(7),
    StaffName   Varchar(50)
    )
INSERT INTO @staffNameTable
SELECT * FROM dbo.fn_Staff_Full_Name()

SELECT  @TempStaff =    (
                SELECT  StaffId
                FROM    @staffNameTable st
                WHERE   st.StaffName = @staff_Full_name 
                )
END 
DECLARE @staff  TABLE
            (
    StaffId char(10)
    )

INSERT INTO @staff (StaffId)
SELECT * FROM dbo.fn_Supervisor_List(10, @TempStaff)`

功能是

ALTER FUNCTION [dbo].[fn_Supervisor_List] 
(
    @looptill   Int,
    @StaffId    varchar(10)
)
RETURNS 
@staff  TABLE
    (
    StaffId char(10)
    )
AS
BEGIN
    DECLARE 
        @loop       int 

    INSERT  INTO    @staff
    SELECT  s.StaffId
    FROM    Staff s with (nolock)
    WHERE   s.StaffId like @StaffId

    BEGIN
        SELECT  @loop = 0

        WHILE   @loop < @looptill 
        BEGIN

            INSERT  INTO    @staff
            SELECT  s.StaffId
            FROM    dbo.StaffSupervisors s with (nolock)
            --WHERE s.super_id in   (
            WHERE   s.SupervisorId in   (
                        SELECT  s2.StaffId
                        FROM    @Staff s2
                        )
            AND s.StaffId not in    (
                            SELECT  s2.StaffId
                            FROM    @Staff s2
                            )
            SELECT  @loop = @loop + 1
        END
    END
    RETURN 
END

当我在填充后运行 SELECT @TempStaff 时 - 我得到了我期望的变量,但是当我最后运行 SELECT * FROM @Staff 时,@Staff 是空的。

【问题讨论】:

  • 你有没有试过在你选择一个值后立即打印出@TempStaff?你得到预期的输出了吗?
  • 有什么理由写这个循环而不只是使用 CTE?

标签: sql sql-server


【解决方案1】:

好的,我发现了问题,我已将 Value @TempStaff 声明为 Varchar,但是当我将其更改为 INT 时,它工作正常。感谢所有发布建议的人。我一定会研究 CTE 的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2017-06-23
    相关资源
    最近更新 更多