选择并设置不在TSQL FUNCTION中一起使用

时间:2014-08-15 17:08:49

标签: sql sql-server tsql

我在SQL SERVER中使用了一个函数,并使用select和after设置了一个用户变量。但似乎设置不起作用。

--@id is input
Declare @result varchar(MAX)
        SELECT @result = INFO FROM USER_INFO WHERE ID= +''+'DOMAIN\'+@id+''
        IF @result IS NULL
            SET @result = 'DOMAIN\'+@id+''      
    return (@result)

如果找不到用户,我想选择id而不是空值。但似乎它永远是空的 Set在条件语句中不起作用。 我做错了什么?

以下是更新:

是滑的,我检查了它的空白。如果我设置

SET @result ='MY ID'

虽然有效,但@result = 'DOMAIN\'+@id无效

整个功能

FUNCTION [dbo].[USER_INFO] 
(
    -- Add the parameters for the function here
    @id varchar(300)
)
RETURNS varchar(MAX)
AS
BEGIN
     Declare @result varchar(MAX)
            SELECT @result = INFO FROM USER_INFO WHERE ID= +''+'DOMAIN\'+@id+''
            IF @result IS NULL
                SET @result = 'DOMAIN\'+@id+''      
        return (@result)
END

4 个答案:

答案 0 :(得分:1)

如果真的是整个功能,你需要第一行是"创建功能" (或" ALTER FUNCTION"如果它已经存在),而不仅仅是" FUNCTION" ...

这将消除函数返回NULL:

DECLARE @result VARCHAR(MAX)
    -- Eliminate NULL being passed in so string concatenation doesn't return NULL
    IF @id IS NULL
        SET @id = ''
    -- Set the output value...if nothing exists, set it to 'x'
    SET @result = (SELECT TOP 1 ISNULL(INFO,'x') FROM USER_INFO WHERE ID = 'DOMAIN\' + @id);
    -- Now, neither @result OR @id will be NULL so the following should always return something other than NULL
    IF @result = 'x'
            SET @result = 'DOMAIN\' + @id
RETURN (@result)

答案 1 :(得分:0)

根据其他评论,试试这个:

Declare @result varchar(MAX)
        SELECT @result = INFO FROM USER_INFO WHERE ID= 'DOMAIN\'+@id
        IF @result IS NULL
            SET @result = 'DOMAIN\'+ ISNULL(@id, '')      
    return (@result)

我认为你不需要所有用引号和加号来处理

答案 2 :(得分:0)

你应该这样试试。最后不需要那些额外的''单引号

Declare @result varchar(MAX)
        SELECT @result = INFO FROM USER_INFO WHERE ID= 'DOMAIN\' + @id
        IF @result IS NULL
            SET @result = 'DOMAIN\' + @id     
    return (@result)

很少提及:您的函数名称和表名称都相同user_info。尝试以不同的方式命名它们,如

FUNCTION [dbo].[Get_USER_INFO] 
(
    -- Add the parameters for the function here
    @id varchar(300)
)

SELECT @result = INFO FROM USER_INFO

此外,您应该调用您的函数

select dbo.Get_USER_INFO('my-user_id')

答案 3 :(得分:0)

select和set之间的区别在于,如果set没有找到任何值,那么它将返回null但是如果select没有找到任何值,那么它将显示变量的先前值,同样的情况正在发生当@result值为null时,选择不分配任何值并返回相同的先前值而不是赋值null,这就是if语句为false且不移动到Set语句的原因。

koppinjo,如果@result变量从未设置为任何东西,那么它应该击中该块,但我想第一次@result变量值不为null因此它不会击中该块。
请查看此内容以获得更多说明。

http://www.mssqltips.com/sqlservertip/1888/when-to-use-set-vs-select-when-assigning-values-to-variables-in-sql-server/