【发布时间】:2013-08-08 23:03:24
【问题描述】:
我创建了一个用户定义的表类型:
CREATE TYPE dbo.ListTableType AS TABLE(
ITEM varchar(500) NULL
)
我在一个函数中利用它:
CREATE FUNCTION dbo.fn_list_to_string
(
@LIST dbo.ListTableType READONLY
)
RETURNS varchar(max)
AS
BEGIN
DECLARE @RESULT varchar(max)
SET @RESULT = ''
DECLARE @NL AS CHAR(2) = CHAR(13) + CHAR(10)
SELECT @RESULT = @RESULT + ITEM + @NL FROM @LIST
SET @RESULT = SUBSTRING(@RESULT, 1, LEN(@RESULT) - 1)
RETURN @RESULT
END
最后,我尝试在一个简单的选择中使用这个函数:
SELECT
P.PROGRAM_ID,
PROGRAM_NAME,
PROGRAM_DESC,
P.STATUS_ID,
STATUS_DESC,
P.CONTACT_SID,
I.FIRST_NAME + ' ' + I.LAST_NAME as CONTACT_NAME,
P.CLARITY_ID,
dbo.fn_list_to_string(
( SELECT CONVERT(varchar,CLARITY_ID) as ITEM
FROM dbo.MUSEUM_PROGRAM_PROJECTS as A
JOIN dbo.MUSEUM_PROJECTS as B on B.PROJECT_ID = A.PROJECT_ID
WHERE PROGRAM_ID = P.PROGRAM_ID )
) as PROJECT_CLARITY_IDS
FROM dbo.MUSEUM_PROGRAMS as P
LEFT JOIN dbo.MUSEUM_PROGRAM_STATUS_TYPES as S on S.STATUS_ID = P.STATUS_ID
LEFT JOIN dbo.v_IDVAULT_ENRICHED_CURRENT_EMPLOYEES as I on I.[SID] = P.CONTACT_SID
但我收到此错误:
操作数类型冲突:varchar 与 ListTableType 不兼容
知道为什么吗?此外,如果有另一种 [更优雅] 的方式来实现我正在尝试做的事情,我也愿意接受建议!提前致谢!
【问题讨论】:
-
(1) don't use
varcharwithout length (2) 在函数的输入中,您不能用子查询替换表类型,这看起来就像您实际上有一个表类型。我建议你发布你真正想要得到的结果,我认为FOR XML PATH有一个更简单的方法。 -
例如,子查询可以返回两个 CLARITY_ID:25245 和 14355。我想将其显示为带有新行的字符串。
-
在 SQL Server 中搜索
GROUP_CONCAThacks 以将列表投影到标量 varchar 中,例如stackoverflow.com/questions/8868604/…。但是你的想法很有趣:) -
还有一点需要注意:即使你确实想使用一个函数,你也不需要表类型。您可以只发送一个 PROGRAM_ID 到函数并使其在进行连接(使用 FOR XML 或您的原始方法)之前读取值本身(而不是子查询)。
标签: sql sql-server sql-server-2008 user-defined-functions user-defined-types