代码之家  ›  专栏  ›  技术社区  ›  tsouchlarakis

来自输入列的SQL Server函数中的表变量

  •  1
  • tsouchlarakis  · 技术社区  · 6 年前

    我想创建一个函数,它基于其他三列的输入返回一列。由于函数中不允许使用临时表,是否可以从三个输入列创建表变量?

    CREATE FUNCTION dbo.convert_value(
        @CustomerID VARCHAR(MAX),
        @CustomerValue VARCHAR(MAX),
        @CustomerDescription VARCHAR(MAX)
    )
    RETURNS FLOAT
    AS BEGIN
    
    DECLARE @CustomerTable TABLE (
        UniquePatientUID VARCHAR(MAX),
        ResultValue VARCHAR(MAX),
        PracticeDescription VARCHAR(MAX)
    );
    
    -- How can I insert @UniquePatientUID, @ResultValue and @PracticeDescription into @CustomerTable
    
    END
    

    这个问题的上下文是我有一个SQL脚本,它使用临时表和许多 UPDATE ALTER TABLE 语句,我需要将其转换为函数。该脚本以前面提到的三列开头,并添加了第四列, Converted_Value 用几百行代码计算并操作临时表。这里有希望吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Colin G    6 年前

    表变量插入实际上与常规插入没有区别。不要使用临时表。您也可以更改该表,或者只是用第四列声明它,并允许它为空。

    INSERT INTO @CustomerTable (UniquePatientUID, ResultValue, PracticeDescription)
    VALUES(@CustomerID, @CustomerValue, @CustomerDescription);
    

    别忘了把浮球还回去。

        2
  •  1
  •   D-Shih    6 年前

    表变量是一个表,因此,您可以使用 INSERT INTO ... VALUES....

     INSERT INTO @CustomerTable (UniquePatientUID,ResultValue,PracticeDescription ) 
     VALUES
     (@UniquePatientUID, @ResultValue , @PracticeDescription)
    
        3
  •  1
  •   Xedni    6 年前

    除非你 需要 一个表变量出于某种特定的原因,为什么不将变量作为派生表表达式来使用呢?即

    ;with inputs (UniquePatientUID, ResultValue, PracticeDescription) as
    (
        select @UniquePatientUID, @ResultValue, @PracticeDescription
    )
    select *
    from inputs
    

    表变量在函数调用后超出范围,并且您也不能在函数中或函数之外传递表类型。所以,实际上,表变量在这里所做的就是作为一种保存位置的方法,这对于SQL开发人员来说更为熟悉。但它们不是免费的,这是我好奇您的用例是什么的唯一原因。

    如果不需要将它们作为集合或类似的东西返回,也可以直接与变量交互。