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