iT邦幫忙

0

請問 ms sql 如何在自訂函數中使用亂數?

  • 分享至 

  • xImage

[原由] :想在ms sql 建立函數 能產生我想指定的亂數字串
例如 select fnGenRandWord() <--想要的方式 自訂函數 fnGenRandWord()
得出 指定的字串 "20230328+(指定範圍內亂數)" <--想要的指定字串+亂數

但 create function 時 都會出現
"在函數中使用副作用運算子 'rand' 無效。"
試過了 newid(),Crypt_Gen_Random 也一樣。

alien663 iT邦研究生 5 級 ‧ 2023-03-28 16:52:14 檢舉
你又不給程式碼,怎樣幫你debug?
achan iT邦研究生 4 級 ‧ 2023-03-28 16:59:05 檢舉
@alien663 抱歉 我最近才開始學寫 sql 預存程序 ,今天想將需求寫成函數才發現自訂函數內無法使用 rand() 等函數

CREATE FUNCTION fnGenRandWord()
RETURNS INT
AS
BEGIN
DECLARE @result INT;
SET @result = ROUND(RAND() * 100, 0);
RETURN @result;
END

錯誤訊息
訊息 443,層級 16,狀態 1,程序 fnGenRandWord,行 6 [批次開始行 0]
在函數中使用副作用運算子 'rand' 無效。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
allenlwh
iT邦高手 1 級 ‧ 2023-03-28 17:00:04
最佳解答

我以前曾經這樣做過:
1.把內建函數,寫成一個view。
2.自訂函數function,去select這個view。

CREATE VIEW [dbo].[Rand_view]
AS
SELECT RAND() as myRand
GO
CREATE FUNCTION [dbo].[GetRnd] 
(
	@name varchar(10)
)
RETURNS @table table
(
	result VARCHAR(50)
)
AS
BEGIN	
    INSERT INTO @table (result)
        SELECT @name+'-'+convert(varchar,myRand) from [Rand_view]

    RETURN
END
GO
select * from GetRnd('user')
-->user-0.28329
achan iT邦研究生 4 級 ‧ 2023-03-28 17:13:16 檢舉

謝謝回答
但我希望傳回的是 varchar 型態 而非table

我想想看怎麼從您的建議(1.把內建函數,寫成一個view。)來改

allenlwh iT邦高手 1 級 ‧ 2023-03-28 17:36:26 檢舉
Create FUNCTION [dbo].[GetRnd] 
(
	@name nvarchar(10)
)
RETURNS nvarchar(100)
AS
BEGIN	
    Declare @result nvarchar(100)
	SELECT @result=@name+'-'+convert(varchar,myRand) 
        from [Rand_view]
    
	RETURN  @result
END
GO
select  dbo.GetRnd('user')
achan iT邦研究生 4 級 ‧ 2023-03-28 18:09:16 檢舉

謝謝! 成功了!

我要發表回答

立即登入回答