用 T-SQL 创建一个可视化的骰子滚轮(只是为了好玩)

Sim*_*o33 5 t-sql sql-server dice

只是为了好玩,我想使用 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
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何提高效率?有没有办法在没有这么多UNIONs 的情况下做到这一点?

我也有兴趣看到人们可能对扩展此/使其更有趣的任何想法!

Bar*_*and 4

使用表变量而不是临时表。并将所有三行包含在同一个表变量中:

\n\n
DECLARE @Rows TABLE ([Row] INT, [1] NCHAR(1), [2] NCHAR(1), [3] NCHAR(1));\nDECLARE @Number INT;\nDECLARE @Count INT = 1;\nDECLARE @Dice INT = 2;\n\nWHILE @Count <= @Dice\nBEGIN\nSET @Number = ROUND(RAND(CONVERT(VARBINARY,NEWID()))*6,0,1)+1;\n\nINSERT INTO @Rows ([Row], [1], [2], [3]) VALUES\n(\n     1\n    ,CASE WHEN @Number < 4 THEN N'' ELSE N'\xe2\x80\xa2' END\n    ,N''\n    ,CASE WHEN @Number = 1 THEN N'' ELSE N'\xe2\x80\xa2' END\n),\n(\n     2\n    ,CASE WHEN @Number <> 6 THEN N'' ELSE N'\xe2\x80\xa2' END\n    ,CASE WHEN @Number % 2 = 0 THEN N'' ELSE N'\xe2\x80\xa2' END\n    ,CASE WHEN @Number <> 6 THEN N'' ELSE N'\xe2\x80\xa2' END\n),\n(\n     3\n    ,CASE WHEN @Number = 1 THEN N'' ELSE N'\xe2\x80\xa2' END\n    ,N''\n    ,CASE WHEN @Number < 4 THEN N'' ELSE N'\xe2\x80\xa2' END\n);\n\nSELECT [1], [2], [3] FROM @Rows ORDER BY [Row];\nDELETE FROM @Rows;\n\nSET @Count += 1;\nEND;\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:

\n\n

我更新了我的解决方案,以便将三个记录插入到单个 INSERT 语句中,而不是为每个记录插入三个单独的 INSERT 语句。

\n

  • 你刚刚打败了我。可能值得删除“order by”,因为默认情况下会发生这种情况,然后您可以删除“Row”列以匹配OP的结果:“SELECT [1], [2], [3] FROM @Rows;” (2认同)