Sql 函数选择随机Id
我想选择一个随机id,其中我的列Guy_Checked不是1 这是我的密码: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;
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 |
+--------+-------------+-----------------+