2015-01-16 112 views
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. 

反正有沒有做到這一點? 在此先感謝。

回答

1

不能使用Non-deterministic Funcions內UDF

創建Vieworder by

create view Random 
as 
select newid() as New_id 

更改使用它,你select這樣的事情。

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 (SELECT new_id 
      FROM random) 
+0

哇! 你讓我很快樂的人....我在前面看到的這個例子,但不知道如何正確地在我的情況下使用...你表明,它在這樣一個簡單的方法.. –