我试图制作一个简单的函数来返回随机眼睛颜色。我可以在存储过程中执行此操作,但我试图挑战自我并尝试新的东西。我收到了一些错误,我已经尝试了几种不同的方法,我发现一些文档大致相关,但我只是不熟练,我想要了解我做错了什么以及文件是什么我发现它的语法也很明智。我希望这是有道理的。
CREATE FUNCTION Random_Eyes ()
RETURNS NVARCHAR(100)
AS
BEGIN
CREATE VIEW Rand_Eyes
AS
SELECT TOP 1 [Eyes]
FROM [dbo].[Eyes]
ORDER BY NEWID()
GO
DECLARE @Eyes AS NVARCHAR(100) = (SELECT [Eyes] FROM Rand_Eyes)
RETURN @Eyes
DROP VIEW Rand_Eyes
END
GO
错误:
Msg 156,Level 15,State 1,Procedure Random_Eyes,Line 14
关键字' VIEW'附近的语法不正确。Msg 102,Level 15,State 1,Procedure Random_Eyes,Line 14
附近的语法不正确
')'Msg 178,Level 15,State 1,Line 4
带有返回值的RETURN语句不能在此上下文中使用。Msg 102,Level 15,State 1,Line 7
' END'附近的语法不正确。
任何反馈或建议都会有所帮助。谢谢
答案 0 :(得分:1)
您不需要在函数内部使用临时视图 - 因为SQL Server中的函数是严格只读的,所以甚至都不允许这样做:它们不能执行任何DDL操作(CREATE,UPDATE,INSERT,DELETE)。
请注意,ORDER BY NEWID()
不是获取随机结果的最佳方式(因为它会触发表格线性扫描)。试试这个:
CREATE FUNCTION Random_Eyes()
RETURNS NVARCHAR(100)
AS
BEGIN
DECLARE @count int = ( SELECT COUNT(*) FROM [Eyes] )
SELECT
Eyes
FROM
dbo.Eyes
ORDER BY
EyeId -- or whatever your constant, incrementing primary-key is
OFFSET
( RAND() * @count ) ROWS
FETCH NEXT
1 ROWS ONLY
END