Tsql 为什么设置这样的变量会有所不同?

Tsql 为什么设置这样的变量会有所不同?,tsql,sql-server-2014,Tsql,Sql Server 2014,我有一个标量值函数,它在我的存储过程中返回一个VarChar(MAX),我这样做 declare @p_emailAddr varchar(MAX) = (select db.dbo.GetEmails(10)) 如果我执行了print@p_emailAddr操作,它会向我显示它填充了正确的信息,但代码的其余部分无法正确使用它。(我不知道为什么,这毫无意义!) 现在如果我像这样改变它 declare @p_emailAddr varchar(MAX) = 'test@email.com;'

我有一个标量值函数,它在我的存储过程中返回一个
VarChar(MAX)
,我这样做

declare @p_emailAddr varchar(MAX) = (select db.dbo.GetEmails(10))
如果我执行了
print@p_emailAddr
操作,它会向我显示它填充了正确的信息,但代码的其余部分无法正确使用它。(我不知道为什么,这毫无意义!)

现在如果我像这样改变它

declare @p_emailAddr varchar(MAX) = 'test@email.com;'
我的代码的其余部分应该是完美的

这两种设置
@p_emailAddr
的方法之间有什么区别

这是获取电子邮件的代码

ALTER FUNCTION [dbo].[GetEmails](@p_SubID int)
RETURNS varchar(max)
AS
BEGIN
    DECLARE @p_Emails varchar(max)

    SELECT @p_Emails = COALESCE(@p_Emails + ';', '') + E.EmailAddress
    FROM    db.dbo.UserEmailAddr E JOIN
            db.dbo.EmailSubscriptionUsers S on e.ClockNumber = s.Clock AND S.SubID = @p_SubID

    SET @p_Emails = @p_Emails + ';'
    RETURN @p_Emails
END

从GetEmails(10)中得到了什么?varchar(max)是一个字符串值,需要一个值。您可以有一个表变量,或者如果dbo.getemails(10)是一个表,只需在希望使用@p_emailaddr的地方加入它即可

最好的

另类

create table #GetEmails (emails varchar(max))
insert into #GetEmails values ('email@test.com'), ('test@email.com')

declare @p_emailAddr table (emails varchar(max))
insert into @p_emailAddr(emails)
select * 
from #GetEmails


select * 
from @p_emailAddr

你能为
GetEmails
显示代码吗?显示其余代码+GetEmails代码(10)没有任何区别。函数返回的值与字符串文本中的值实际上不可能相同。我所说的“不能正常工作”是指它不能使用@p_emailAddr set函数执行。你的代码是否适用于
declare@p_emailAddr varchar(MAX)='test@email.com;test2@email.com;'显示其余代码发现问题时,函数可能会返回多封电子邮件(无论如何,它高度依赖于基础表,您应该使用XML+格式)。查看我在OP中的最后一条评论,这是存储过程和getEmails()函数之间的权限问题。
create table #GetEmails (emails varchar(max))
insert into #GetEmails values ('email@test.com'), ('test@email.com')

declare @p_emailAddr table (emails varchar(max))
insert into @p_emailAddr(emails)
select * 
from #GetEmails


select * 
from @p_emailAddr