Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 函数选择随机Id_Sql_Sql Server - Fatal编程技术网

Sql 函数选择随机Id

Sql 函数选择随机Id,sql,sql-server,Sql,Sql Server,我想选择一个随机id,其中我的列Guy_Checked不是1 这是我的密码: CREATE FUNCTION dbo.get_rand_id() RETURNS int AS BEGIN DECLARE @ret int; set @ret = (select top 1 Guy_ID FROM SantaGuys WHERE Guy_Checked <> 1 ORDER BY RAND()) RETURN @ret;

我想选择一个随机id,其中我的列Guy_Checked不是1

这是我的密码:

CREATE FUNCTION dbo.get_rand_id()  
RETURNS int   
AS   
BEGIN  
    DECLARE @ret int;  
    set @ret = (select top 1 Guy_ID
    FROM SantaGuys
    WHERE Guy_Checked <> 1
    ORDER BY RAND())
RETURN @ret;  
END; 
我做错了什么?

改用NEWID:

在整个查询过程中,RAND实际上是一个常量——在查询开始处理之前,它会被计算一次。每次调用NEWID时都会生成不同的id。

您可以使用NEWID,它将创建uniqueidentifier类型的唯一值

CREATE FUNCTION dbo.get_rand_id()  
RETURNS int   
AS   
BEGIN  
    DECLARE @ret int;  
    set @ret = (select top 1 Guy_ID
    FROM SantaGuys
    WHERE Guy_Checked <> 1
    ORDER BY NEWID())
RETURN @ret;  
END; 

我提供这个答案,我改编自

从中轻松生成ASCII表。希望这有帮助

CREATE FUNCTION dbo.get_rand_id()  
RETURNS int   
AS   
BEGIN  
    DECLARE @ret int;  
    set @ret = (select top 1 Guy_ID
    FROM SantaGuys
    WHERE Guy_Checked <> 1
    ORDER BY NEWID())
RETURN @ret;  
END; 
-- Build the table
SELECT 123 as Guy_ID
      ,0 as Guy_Checked INTO SantaGuys;

INSERT INTO SantaGuys VALUES (234, 1);
INSERT INTO SantaGuys VALUES (456, 0);
INSERT INTO SantaGuys VALUES (567, 1);

GO


-- Create a view of RAND() to work around the Invalid use of side-effecting error
CREATE VIEW v_get_rand_id
AS
SELECT RAND() as rand_id;
GO


-- Build the function with parameters that will be in your SELECT query
CREATE FUNCTION dbo.get_rand_id(@my_Guy_ID as int, @my_Guy_Checked as int)  
RETURNS float    
AS   
BEGIN  
 DECLARE @my_rand_id float; 

 SET @my_rand_id = (SELECT CASE WHEN @my_Guy_Checked <> 1 
                                THEN v.rand_id 
                                ELSE 0 END as my_rand_id 
                      FROM v_get_rand_id v)

 RETURN @my_rand_id;  

END; 

GO

-- Run your query and enjoy the results
SELECT sg.Guy_ID
      ,sg.Guy_Checked
      ,dbo.get_rand_id(sg.Guy_ID, sg.Guy_Checked) as my_rand_id
  FROM SantaGuys sg;
+--------+-------------+-----------------+
| Guy_ID | Guy_Checked |   my_rand_id    |
+--------+-------------+-----------------+
|    123 |           0 | 0.5537264103585 |
|    234 |           1 |               0 |
|    456 |           0 |  0.227823559345 |
|    567 |           1 |               0 |
+--------+-------------+-----------------+