首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure数据仓库中的表变量

Azure数据仓库中的表变量
EN

Stack Overflow用户
提问于 2018-01-17 20:53:54
回答 2查看 6.2K关注 0票数 9

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

代码语言:javascript
复制
declare @table as table (a int)

在Azure数据仓库中,这会引发一个错误。

在以下一行解析错误: 1,列: 19:表附近的不正确语法

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

代码语言:javascript
复制
create table #table (a int)

但不是内部功能。

Msg 2772、级别16、状态1、第6行不能从函数中访问临时表。

微软的本文件说,

必须分两个步骤(而不是内联)声明my_type:◾创建类型◦作为表.,然后◾声明@mytablevariable my_type;。

但当我尝试这个:

代码语言:javascript
复制
create type t as table (a int);
drop type t;

我明白了:

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

我的目标是在使用临时表的Azure数据仓库中拥有一个函数。这能实现吗?

编辑从这里开始

注意,我并不是在寻找其他方法来创建一个特定的函数。我确实做过这件事,然后继续前进。我是一个资深的程序员,但一个Azure数据仓库新手。我想知道是否有可能在Azure数据仓库功能中包含一些临时表的概念。

EN

回答 2

Stack Overflow用户

发布于 2018-01-24 22:42:31

好吧,我相信这就是你想要的。

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

其次,使用Table变量或临时表,只是一些好的奇数字符串操作、一点数学和一个CTE。绝对没有昂贵的WHILE循环。

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

代码语言:javascript
复制
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;

如果你不明白这一切,请问一问。

票数 2
EN

Stack Overflow用户

发布于 2018-01-23 11:02:12

无法在用户定义函数(UDF)中创建对象。使用表变量代替。

如果你想要你使用用户定义的类型,首先在UDF之外创建它,并将它作为UDF中的变量类型使用。

代码语言:javascript
复制
-- 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48309826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档