Создание визуального ролика для игры в кости с T-SQL (просто для удовольствия) - PullRequest
4 голосов
/ 12 апреля 2019

Ради интереса я хотел создать визуальный ролик для игры в кости с использованием SQL (я знаю, что это совсем не то, для чего предназначен язык).

Я придумал приведенный ниже код, который будетбросьте столько кубиков, сколько хотите (@Dice) и покажите визуальное представление каждого, как у обычного шестигранного кубика.

CREATE TABLE #Row1 ([1] CHAR(1), [2] CHAR(1), [3] CHAR(1))
CREATE TABLE #Row2 ([1] CHAR(1), [2] CHAR(1), [3] CHAR(1))
CREATE TABLE #Row3 ([1] CHAR(1), [2] CHAR(1), [3] CHAR(1))

DECLARE @Number INT
DECLARE @Count INT = 1
DECLARE @Dice INT = 2

WHILE @Count <= @Dice
BEGIN
SET @Number = ROUND(RAND(CONVERT(VARBINARY,NEWID()))*6,0,1)+1

INSERT INTO #Row1 ([1], [2], [3]) VALUES (
 CASE WHEN @Number < 4 THEN ''
                       ELSE '•'
                       END
,''
,CASE WHEN @Number = 1 THEN ''
                       ELSE '•'
                       END
)

INSERT INTO #Row2 ([1], [2], [3]) VALUES (
 CASE WHEN @Number <> 6 THEN ''
                        ELSE '•'
                        END
,CASE WHEN @Number % 2 = 0 THEN ''
                           ELSE '•'
                           END
,CASE WHEN @Number <> 6 THEN ''
                        ELSE '•'
                        END
)

INSERT INTO #Row3 ([1], [2], [3]) VALUES (
 CASE WHEN @Number = 1 THEN ''
                       ELSE '•'
                       END
,''
,CASE WHEN @Number < 4 THEN ''
                       ELSE '•'
                       END
)

SELECT * FROM #Row1
UNION ALL
SELECT * FROM #Row2
UNION ALL
SELECT * FROM #Row3

TRUNCATE TABLE #Row1
TRUNCATE TABLE #Row2
TRUNCATE TABLE #Row3

SET @Count += 1
END

DROP TABLE #Row1
DROP TABLE #Row2
DROP TABLE #Row3

Мой вопрос: как это можно сделать более эффективным??Есть ли способ сделать это без стольких UNION с?

Мне также было бы интересно узнать о том, какие у людей могут быть идеи по расширению этого / сделать его более интересным!

1 Ответ

4 голосов
/ 12 апреля 2019

Используйте переменную таблицы вместо временных таблиц.И включите все три строки в одну и ту же переменную таблицы:

DECLARE @Rows TABLE ([Row] INT, [1] NCHAR(1), [2] NCHAR(1), [3] NCHAR(1));
DECLARE @Number INT;
DECLARE @Count INT = 1;
DECLARE @Dice INT = 2;

WHILE @Count <= @Dice
BEGIN
SET @Number = ROUND(RAND(CONVERT(VARBINARY,NEWID()))*6,0,1)+1;

INSERT INTO @Rows ([Row], [1], [2], [3]) VALUES
(
     1
    ,CASE WHEN @Number < 4 THEN N'' ELSE N'•' END
    ,N''
    ,CASE WHEN @Number = 1 THEN N'' ELSE N'•' END
),
(
     2
    ,CASE WHEN @Number <> 6 THEN N'' ELSE N'•' END
    ,CASE WHEN @Number % 2 = 0 THEN N'' ELSE N'•' END
    ,CASE WHEN @Number <> 6 THEN N'' ELSE N'•' END
),
(
     3
    ,CASE WHEN @Number = 1 THEN N'' ELSE N'•' END
    ,N''
    ,CASE WHEN @Number < 4 THEN N'' ELSE N'•' END
);

SELECT [1], [2], [3] FROM @Rows ORDER BY [Row];
DELETE FROM @Rows;

SET @Count += 1;
END;

Редактировать:

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

...