Табличные переменные в хранилище данных Azure

В базе данных SQL Server можно использовать такие переменные таблицы, как это:

declare @table as table (a int)

В хранилище данных Azure это приводит к ошибке.

Ошибка разбора в строке: 1, столбец: 19: неверный синтаксис рядом с таблицей

В хранилище данных Azure вы можете использовать временные таблицы:

create table #table (a int)

но не внутри функций.

Сообщение 2772, уровень 16, состояние 1, строка 6 Невозможно получить доступ к временным таблицам из функции.

Этот документ от Microsoft говорит,

Declare d Должен быть объявлен в два этапа (а не в строке): RECREATE TYPE my_type AS TABLE ...;, затем ECDECLARE @mytablevariable my_type;.

Но когда я попробую это:

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

Я получаю это:

Сообщение 103010, уровень 16, состояние 1, строка 1 Ошибка разбора в строке: 1, столбец: 8: неверный синтаксис рядом с типом.

Моя цель - иметь функцию в хранилище данных Azure, которая использует временную таблицу. Это достижимо?

Изменить Начать Здесь

Обратите внимание, что я не ищу других способов создания одной конкретной функции. Я действительно сделал это и пошел дальше. Я опытный программист, но новичок в хранилище данных Azure. Я хочу знать, возможно ли включить некоторую концепцию временных таблиц в функцию хранилища данных Azure.

2 ответа

Хорошо, я верю, что это то, что вы после.

Во-первых, здесь используется функция табличных значений, которая значительно быстрее, чем функции табличных значений или скалярных значений.

Во-вторых, не было никакой необходимости использовать переменную таблицы или временную таблицу, только некоторые хорошие нечетные манипуляции со строками, немного математики и 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
Другие вопросы по тегам