繁体   English   中英

Azure数据仓库中的表变量

[英]Table Variables in Azure Data Warehouse

在SQL Server数据库中,可以使用如下表变量:

declare @table as table (a int)

在Azure数据仓库中,将引发错误。

第1行,第19列的解析错误:“表”附近的语法不正确

在Azure数据仓库中,可以使用临时表:

create table #table (a int)

但不是内部函数。

消息2772,级别16,状态1,第6行无法从函数内部访问临时表。

微软的这份文件说:

◦必须分两步声明(而不是内联声明):◾CREATETYPE my_type AS TABLE ...; ,然后是◾DECLARE@mytablevariable my_type;。

但是当我尝试这个:

create type t as table (a int);
drop type t;

我得到这个:

消息103010,级别16,状态1,第1行在第1行,第8列的语法分析错误:“类型”附近的语法不正确。

我的目标是在使用临时表的Azure数据仓库中具有一个功能。 可以实现吗?

编辑从这里开始

请注意,我不是在寻找其他方法来创建一个特定功能。 我实际上已经做到了,然后继续前进。 我是一名资深程序员,但还是Azure Data Warehouse的新秀。 我想知道是否有可能在Azure数据仓库功能中合并一些临时表的概念。

好吧,我相信这就是你所追求的。

首先,它使用表值函数,这比标量或多语句表值函数快得多。

其次,表变量或临时表没有用,只有一些很好的奇数字符串操作,一些数学运算和CTE。 绝对没有昂贵的WHILE循环。

我已经对链接中的示例进行了测试,它们都返回了预期值。

USE Sandbox;
GO
CREATE FUNCTION ValidateHealthNumber (@HealthNumber varchar(10))
RETURNS TABLE
AS
RETURN

    WITH Doubles AS(
        SELECT CONVERT(tinyint,SUBSTRING(V.HN,O.P,1)) AS HNDigit,
               CONVERT(tinyint,SUBSTRING(V.HN,O.P,1)) * CASE WHEN O.P % 2 = 0 THEN 1 ELSE 2 END ToAdd
        FROM (VALUES(@HealthNumber)) V(HN)
              CROSS APPLY (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)) O(P)),
    Parts AS (
        SELECT CONVERT(tinyint,SUBSTRING(CONVERT(varchar(2),ToAdd),1,1)) AS FirstDigit, --We know that the highest value can be 18 (2*9)
               CONVERT(tinyint,SUBSTRING(CONVERT(varchar(2),ToAdd),2,1)) AS SecondDigit --so no need for more than 2 digits.
        FROM Doubles)
    SELECT CASE RIGHT(@HealthNumber, 1) WHEN 10 - RIGHT(SUM(FirstDigit + SecondDigit),1) THEN 1 ELSE 0 END AS IsValid
    FROM Parts;

GO

CREATE TABLE #Sample(HealthNumber varchar(10));
INSERT INTO #Sample
VALUES ('9876543217'), --Sample
       ('5322369835'), --Valid 
       ('7089771195'), --Valid
       ('8108876957'), --Valid
       ('4395667779'), --Valid
       ('6983806917'), --Valid
       ('2790412845'), --not Valid
       ('5762696912'); --not Valid

SELECT *
FROM #Sample S
     CROSS APPLY ValidateHealthNumber(HealthNumber) VHN;
GO
DROP TABLE #Sample
DROP FUNCTION ValidateHealthNumber;

如果您不了解这些,请询问。

不,你不能。 无法在用户定义函数(UDF)中创建对象。 请改用表变量。

如果要使用用户定义的类型,请首先在UDF外部创建它,然后将其用作UDF中的变量类型。

-- Create the data type
CREATE TYPE TestType AS TABLE 
(
    Id INT NOT NULL,
    Col1 VARCHAR(20) NOT NULL)
GO

-- Create the tabled valued function
CREATE FUNCTION TestFunction
()
RETURNS 
@Results TABLE 
    (Result1 INT, Result2 INT)
AS
BEGIN
    -- Fill the table variable with the rows for your result set
    DECLARE @Var1 TestType;

    RETURN 
END
GO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM