在TSQL函数中选择并设置不一起工作

在TSQL函数中选择并设置不一起工作,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用SQL SERVER中的函数,并使用select和after设置用户变量。但似乎set不起作用 --@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+''

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

--@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 @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

根据其他注释,尝试以下操作:

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)

我认为你不需要处理所有的引号和加号,你应该这样尝试。不需要那些额外的
'
单引号

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\u 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')

select和set之间的区别在于,如果set没有找到任何值,它将返回null,但如果select没有找到任何值,它将显示变量的前一个值,当@result value为null时,同样的情况也会发生。选择“不指定任何值”并返回相同的前一个值,而不是指定null,这就是if语句为false且不移动到Set语句的原因

koppinjo,如果@result变量从未设置为任何值,那么它应该命中块,但我猜第一次@result变量值不是null,因此它没有命中块。
请查看此帖子以获得更多澄清


如果这真的是整个函数,您需要第一行是“CREATE function”(如果已经存在则是“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)

您确定
@id
不为空吗?Set和select似乎可以像这样正常工作。就像滑头皮特提到的,你确定你传递的ID不是空的吗?因为此查询工作正常。@意大利语安装-
=
在sql server中无效<代码>=是相等的,并且
=
/
是不等式。您能展示整个过程/函数以及如何调用它吗
@id
看起来超出了范围…@Sumit Tiwari您似乎需要处理id不为null的问题,或者如果它为null,您希望它是什么值。我发现的是@id为null。可能是范围问题吗?无法摆脱此问题:(你是如何调用函数的?我的意思是你要传递给
@id
?从USER\u INFOwhat中选择functname(id)?这是错误的。你应该像
选择dbo.func\u name('my\u id')那样调用它)
。此外,您为什么要将函数命名为与表相同的函数。我的意思是,您的函数和表都命名为
user\u info
?在这种情况下,@result变量被声明,但从未设置为任何值。默认情况下,它为空,因此无论他使用的是set还是select,if块都应该被命中。在您的帖子中,您这样说“…select不分配任何值并返回相同的前一个值,而不是分配null…”但此时,“前一个值”为null。因此,在此实现集中,select将执行相同的操作。如果“@result”设置为“select@result=…”之前的字符串文字/某个值,则会产生差异。”