首页 > 解决方案 > 声明和赋值表函数

问题描述

我需要将我的声明部分放入一个表值函数中。

CREATE FUNCTION  [Manual_COUNTRIES_2019](
@risk_1, 
@risk_2,
@risk_3,
@risk_4,
@risk_5)
RETURNS (@risk_1, @risk_2,@risk_3,@risk_4,@risk_5) TABLE (Code VARCHAR(100))
AS
BEGIN

DECLARE @risk_1 TABLE (Code VARCHAR(100));
INSERT INTO @risk_1 (Code) VALUES ('AA'),('AB'),('AC');     
DECLARE @risk_2 TABLE (Code VARCHAR(100));
INSERT INTO @risk_2 (Code) VALUES ('AX'),('AY'),('AZ');
DECLARE @risk_3 TABLE (Code VARCHAR(100));
INSERT INTO @risk_3 (Code) VALUES ('BB'),('BC'),('BD'),('BE');
DECLARE @risk_4 TABLE (Code VARCHAR(100));
INSERT INTO @risk_4 (Code) VALUES ('DA'),('DB'),('DC');
DECLARE @risk_5 TABLE (Code VARCHAR(100));
INSERT INTO @risk_5 (Code) VALUES ('YY'),('XZ');
  RETURN
END

我以此为模板:Declare variable in table valued function

但是,它对我的​​表格建议和@risks 列表都不满意。我错过了什么?

标签: sql-servertsql

解决方案


由于您不能返回多个表,我建议添加另一列来指定要添加到的表,然后可以在调用时对其进行过滤。

CREATE FUNCTION  [Manual_COUNTRIES_2019]()
RETURNS @Risk TABLE (RiskNum int, Code VARCHAR(100))
AS
BEGIN
    INSERT INTO @risk (RiskNum, Code)
        VALUES (1, 'AA'),(1, 'AB'),(1, 'AC'),
        (2, 'AX'),(2, 'AY'),(2, 'AZ'),
        (3, 'BB'),(3, 'BC'),(3, 'BD'),(3, 'BE'),
        (4, 'DA'),(4, 'DB'),(4, 'DC'),
        (5, 'YY'),(4, 'XZ');
    RETURN;
END;

但是,由于您现在不需要变量,因此我建议您使用内联表值函数,例如

CREATE FUNCTION [Manual_COUNTRIES_2019]()
RETURNS TABLE
RETURN
    SELECT *
    FROM (       
      VALUES (1, 'AA'),(1, 'AB'),(1, 'AC'),
      (2, 'AX'),(2, 'AY'),(2, 'AZ'),
      (3, 'BB'),(3, 'BC'),(3, 'BD'),(3, 'BE'),
      (4, 'DA'),(4, 'DB'),(4, 'DC'),
      (5, 'YY'),(4, 'XZ')
    ) AS X (RiskNum, Code);

然后,您可以按如下方式提取所需的值:

select Code from dbo.Manual_COUNTRIES_2019() where RiskNum = 1; -- For the first table, change the number to change the table.

推荐阅读