【问题标题】:Must declare the table variable error while creating a TVP function创建 TVP 函数时必须声明表变量错误
【发布时间】:2019-11-16 04:38:38
【问题描述】:

我使用 TVP 创建了以下函数。我最初将数据插入 TVP,然后从中进行选择。

CREATE FUNCTION [dbo].employees_data(
  @employeeIds NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
-- WITH SCHEMABINDING
AS
BEGIN

  CREATE TYPE employees_data
  AS TABLE (can_view_all BIT,role_id INT ,employee_id INT);

  DECLARE @EmployeeDataTVP AS employees_data;

  INSERT INTO @EmployeeDataTVP (can_view_all, role_id, employee_id)
  SELECT
      ur.role_id,
      ua.employee_id
      INNER JOIN user_roles ur ON ur.user_account_id = ua.id
      WHERE ua.employee_id IN (SELECT * FROM STRING_SPLIT(@employeeIds, ','));


   RETURN (SELECT
    (
      CASE
      WHEN ed.role_id = 1 THEN (
        SELECT
          cc.id,
          ISNULL(cc.standard_name, cc.localized_name) AS name,
          cc.client_cost_center_id AS cost_center_id
        FROM s eccs
        LEFT JOIN centers cc on eccs.center_id = cc.id
        WHERE eccs.employee_id = ed.employee_id
        FOR JSON PATH
      )
      ELSE NULL
    END
    ) AS managed_places,
    ed.employee_id
  FROM @EmployeeDataTVP ed
   )
END

但是当我执行该函数时,我得到了Must declare the table variable \"@EmployeeDataTVP\". 错误。我无法弄清楚我做错了什么。

【问题讨论】:

标签: sql-server tsql table-variable


【解决方案1】:

您不需要创建类型而是创建表变量:

CREATE FUNCTION [dbo].employees_data(
  @employeeIds NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
-- WITH SCHEMABINDING
AS
BEGIN

  DECLARE @EmployeeDataTVP TABLE (can_view_all BIT,role_id INT ,employee_id INT);


  INSERT INTO @EmployeeDataTVP (can_view_all, role_id, employee_id)
  SELECT
      ur.role_id,
      ua.employee_id
      INNER JOIN user_roles ur ON ur.user_account_id = ua.id
      WHERE ua.employee_id IN (SELECT * FROM STRING_SPLIT(@employeeIds, ','));


   RETURN (SELECT
    (
      CASE
      WHEN ed.role_id = 1 THEN (
        SELECT
          cc.id,
          ISNULL(cc.standard_name, cc.localized_name) AS name,
          cc.client_cost_center_id AS cost_center_id
        FROM s eccs
        LEFT JOIN centers cc on eccs.center_id = cc.id
        WHERE eccs.employee_id = ed.employee_id
        FOR JSON PATH
      )
      ELSE NULL
    END
    ) AS managed_places,
    ed.employee_id
  FROM @EmployeeDataTVP ed
   )
END

【讨论】:

  • 谢谢它的工作。但我得到Only one expression can be specified in the select list when the subquery is not introduced with EXISTS 错误我相信这是因为(SELECT * FROM STRING_SPLIT(@employeeIds, ',') 声明。有什么办法可以消除错误吗?
  • 尝试用SELECT [value] FROM STRING_SPLIT(@employeeIds, ',')更改它
  • 为什么要使用多线 TVF?这看起来很容易成为一个内联 TVF,它的性能会更好。
  • 内嵌 tvf 如何工作。有相关文档吗?
猜你喜欢
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2014-06-14
  • 2012-05-19
相关资源
最近更新 更多