无法删除函数

时间:2018-03-08 18:50:04

标签: sql sql-server function tsql

我试图制作一个简单的函数来返回随机眼睛颜色。我可以在存储过程中执行此操作,但我试图挑战自我并尝试新的东西。我收到了一些错误,我已经尝试了几种不同的方法,我发现一些文档大致相关,但我只是不熟练,我想要了解我做错了什么以及文件是什么我发现它的语法也很明智。我希望这是有道理的。

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'附近的语法不正确。

任何反馈或建议都会有所帮助。谢谢

1 个答案:

答案 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