Нужно создать функцию для SQL Server - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть этот код SQL, но как создать функцию, используя его?

DECLARE @tbl TABLE(RowId INT IDENTITY(1, 1), ItemName VARCHAR(15));

DECLARE @randomInt INT;

INSERT INTO @tbl(ItemName) 
VALUES ('JAMES'), ('JOHN'), ('ROBERT'), ('MICHAEL'), ('MARY');

SET @randomInt = FLOOR(RAND(CHECKSUM(NEWID())) * 5 + 0);

SELECT ItemName 
FROM @tbl 
WHERE RowId = @randomInt;

Пробовал, но не работает

CREATE FUNCTION U228_TEST_USER_1.mask_firstn () 
RETURNS VARCHAR(15) 
AS 
BEGIN
    DECLARE @tbl TABLE(RowId INT IDENTITY(1,1), ItemName VARCHAR(15));
    DECLARE @randomInt INT;

    DECLARE @result VARCHAR(15);

    INSERT INTO @tbl(ItemName) 
    VALUES ('JAMES'), ('JOHN'), ('ROBERT'), ('MICHAEL'), ('MARY');

    SET @randomInt = FLOOR(RAND(CHECKSUM(NEWID())) * 5 + 0);

    SELECT @result = ItemName, newid() 
    FROM @tbl;

    RETURN @result;
END;

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Ни RAND, ни NEWID не могут быть напрямую связаны с функцией.

Вы можете косвенно ссылаться на них через представление, хотя. Так что вы можете использовать

CREATE VIEW dbo.RandomInt
AS
  SELECT CAST(CRYPT_GEN_RANDOM(4) AS INT) AS Number

GO

CREATE FUNCTION U228_TEST_USER_1.mask_firstn ()
RETURNS VARCHAR(15)
AS
  BEGIN
      DECLARE @OneToFive TINYINT = (SELECT 1 + ABS(Number % 5) FROM dbo.RandomInt);

      RETURN
        (SELECT CHOOSE(@OneToFive, 'JAMES', 'JOHN', 'ROBERT', 'MICHAEL', 'MARY'))
  END 

Скалярных UDF, как правило, следует избегать, но в этом случае, вероятно, все будет в порядке - включение делает более вероятным, что результат будет оцениваться только один раз, а не для каждой строки, что нежелательно в случае генерации случайных данных.

0 голосов
/ 28 апреля 2018

Вы не можете использовать NEWID () в функции, см. this для нескольких обходных путей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...