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

时间:2015-12-11 14:38:26

标签: 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;'

我的其余代码完美应用!

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

1 个答案:

答案 0 :(得分:0)

来自GetEmails(10)的回复是什么? varchar(max)是一个字符串值,期望一个值。您可以拥有一个表变量,或者如果dbo.getemails(10)是一个表,只需将它加入到您希望使用@p_emailaddr的位置

最好的

select *
from table1 t1
join dbo.GetEmails(10) e
on e.email = t1.email

替代

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