1
我在sql server 2012中編寫了一個函數。 我開始知道我們不能在sql server中的select語句中使用RAND()
或NEWID()
函數。 我的功能是這樣的:在UDF中選擇隨機記錄
CREATE FUNCTION Keywordsuggester (@userid INT)
returns @suggestor_tab TABLE (
keywordid INT,
keywordname VARCHAR(max),
keywordcategory VARCHAR(max))
AS
BEGIN
DECLARE @category_table TABLE
(
category_name VARCHAR(max),
category_id INT,
rownum INT
)
DECLARE @ID INT = 1
DECLARE @COUNT INT = 0
DECLARE @I INT = 1
INSERT INTO @category_table
SELECT kc.NAME,
kc.id,
k.NAME,
d.NAME,
Row_number()
OVER(
ORDER BY d.id ASC) AS rownum
FROM dtypes d
JOIN keywords k
ON d.NAME LIKE '%' + k.NAME + '%'
JOIN keywordscategory kc
ON k.categoryid = kc.id
WHERE d.userid = @userid
SELECT @count = rownum
FROM @category_table
WHILE @count > @I
BEGIN
INSERT INTO @suggestor_tab
SELECT TOP 5 kc.id,
k.NAME,
kc.NAME
FROM kwords k
JOIN @category_table ct
ON k.categoryid = ct.category_id
JOIN kwcategory kc
ON kc.NAME = ct.category_name
WHERE ct.rownum = @I
--Here I'm inserting top 5 records for each category into the suggestor_tab,instead I have to insert random 5 records for each category(i.e.,@I)
SET @[email protected] + 1
--return
END
INSERT INTO @suggestor_tab
SELECT kc.id,
k.NAME,
kc.NAME
FROM kwords k
JOIN @category_table ct
ON k.categoryid = ct.category_id
JOIN kwcategory kc
ON kc.NAME = category_name
RETURN
END
如何,我可以得到隨機記錄爲每個類別(即,在while循環@I)。 我試着像查詢:
SELECT TOP 5 k.NAME
FROM kwords k
JOIN @category_table ct
ON k.category_id = ct.id
JOIN kwcategory kc
ON kc.NAME = category_name
WHERE ct.rownum = @I
ORDER BY Newid()
它拋出一個錯誤,如:
Invalid use of a side-effecting operator 'newid' within a function.
反正有沒有做到這一點? 在此先感謝。
哇! 你讓我很快樂的人....我在前面看到的這個例子,但不知道如何正確地在我的情況下使用...你表明,它在這樣一個簡單的方法.. –