将表表达式传递给表参数化函数

问题描述 投票:5回答:2

我具有以下用户定义的功能:

CREATE FUNCTION dbo.GetConcatenatedWithKeyAsInt32(@Values dbo.IndexValue READONLY)
RETURNS TABLE 
WITH SCHEMABINDING
AS 
RETURN (
  SELECT
  [Id],
   -- The definition of [Names] is not really important to this question!
  [Names] = stuff((
    select ', ' + Value
    from @Values AS xt
    where xt.Id = t.Id
    for xml path(''), TYPE
  ).value('.[1]','varchar(max)'), 1, 2, '')
  FROM @Values AS t GROUP BY t.Id);

该参数是用户定义的表类型:

CREATE TYPE IndexValue AS TABLE ( Id int, Value VARCHAR(max) );

我正在努力调用此函数。

我发现了一些例子,人们可以在实际的物理表(或视图)上调用此函数,但是可以肯定的是,可以直接在选择表达式中使用它,不是吗?

我尝试过:

SELECT *
FROM dbo.GetConcatenatedWithKeyAsInt32(
  SELECT c.Id AS Id, a.City AS value
  FROM Customers c
  JOIN Addresses a ON c.Id = a.CustomerId
);

SQL Server不喜欢这样:

Incorrect syntax near the keyword 'SELECT'.
Incorrect syntax near ')'

这可能吗?如果是这样,正确的语法是什么?

或者我真的需要为它创建一个临时表或视图吗?>

SELECT c.Id AS Id, a.City AS value
FROM Customers c
JOIN Addresses a ON c.Id = a.CustomerId

第一?

我有以下用户定义的函数:CREATE FUNCTION dbo.GetConcatenatedWithKeyAsInt32(@Values dbo.IndexValue READONLY)以SCHEMABINDING AS RETURN(SELECT [Id],-...

sql-server sql-server-2008-r2
2个回答
8
投票
回答您的特定问题:

16
投票
否,无法通过引用而不是通过值传递查询表达式(完全不支持您尝试使用的语法)。因此,如果这是您的问题的重点,那么答案是

no

© www.soinside.com 2019 - 2024. All rights reserved.