在TSQL函数中选择并设置不一起工作
我正在使用SQL SERVER中的函数,并使用select和after设置用户变量。但似乎set不起作用在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+''
--@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=…”之前的字符串文字/某个值,则会产生差异。”