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

时间:2018-09-25 22:25:03

标签: sql sql-server tsql

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

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

此问题的上下文是我有一个使用临时表以及许多UPDATEALTER TABLE语句的SQL脚本,我需要将其转换为函数。该脚本从提到的三列开始,然后添加第四列Converted_Value,该列由几百行代码和操纵临时表计算得出。这里有希望吗?

3 个答案:

答案 0 :(得分:1)

表变量插入实际上与常规插入没有什么不同。不要使用临时表。您也可以更改表,或者只是在第四列开始时声明它,并允许它为NULL。

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

别忘了返回FLOAT。

答案 1 :(得分:1)

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

 INSERT INTO @CustomerTable (UniquePatientUID,ResultValue,PracticeDescription ) 
 VALUES
 (@UniquePatientUID, @ResultValue , @PracticeDescription)

答案 2 :(得分:1)

除非出于某些特定原因需要,否则为什么不只将这些变量用作派生表表达式?即

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

表变量在函数调用后超出范围,并且您也不能将表类型传入或传出函数。因此,实际上,表变量在这里所做的所有事情都是一种保留位置的方法,这种方法对于SQL开发人员来说更为熟悉。但是它们不是免费的,这是我很好奇您的用例的唯一原因。

如果您不需要将它们作为集合或类似形式返回,则也可以直接与变量进行交互。